// 判断最大集合里的结点个数是否等于n,若等于,则是连通图;否则,则不是连通图
// 最终还是考察并查集
#include<stdio.h>
#define N 1000int Tree[N];
int sum[N];
int findRoot(int x){
if(Tree[x]==-1) return x;
else{
int tmp=findRoot(Tree[x]);
Tree[x]=tmp;
return tmp;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF && n!=0){
for(int i=1;i<=N;i++){
Tree[i]=-1; sum[i]=1;
}
while(m--){
int a,b;
scanf("%d%d",&a,&b);
a=findRoot(a); b=findRoot(b);
if(a!=b){
Tree[a]=b; sum[b]+=sum[a];
}
}
int ans=1;
for(int i=1;i<=N;i++){
if(Tree[i]==-1 && sum[i]>ans) ans=sum[i];
}
if(ans==n) printf("YES\n");
else printf("NO\n");
}
return 0;
}