//思路:让1为根,当正着找和反向找 都能找到1时,可以说明
//所有的点都可以到达
// 并查集的另一种突破 判断彼此是不是可以到达
#include<stdio.h>
int far[10010];
int re[10010];
int a,b;
int x,y;
int init(int a)
{
for(int i=1; i<=a; i++)
{
far[i]=i;
re[i]=i;
}
}
int find(int x,int flag)
{
if(flag==1)
{
if(far[x]!=1&&far[x]!=x)
{
far[x]=find(far[x],1);
}
return far[x];
}
else
{
if(re[x]!=1&&re[x]!=x)
{
re[x]=find(re[x],2);
}
return re[x];
}
}
void Union(int x,int y)
{
//让 1 为 根节点
if(x>1)
far[x]=find(y,1);//正向查找
if(y>1)
re[y]=find(x,2);//反向查找
}
int check()
{
int i;
for(i=2; i<=a; i++)
if(find(far[i],1)!=1)
return 0;
for(i=2; i<=a; i++)
if(find(re[i],2)!=1)
return 0;
return 1;
}
int main()
{
while(scanf("%d%d",&a,&b),a+b)
{
init(a);
for(int i=0; i<b; i++)
{
scanf("%d%d",&x,&y);
Union(x,y);
}
if(check())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}