#include<bits/stdc++.h>
using namespace std;
/*
给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
*/
vector<int>fat(1001,0);
int n,m,x,y;
//并查集模版三步走
void init(int n)//初始化自己为自己的父亲
{
for(int i=1;i<=n;i++)
{
fat[i]=i;
}
}
int find(int x)//递归找父亲
{
if(fat[x]==0){return x;}
else return fat[x];
}
void uni(int x,int y)//判父亲
{
if(find(x)!=find(y)){
fat[find(x)]=find(y);//把x的父亲 的父亲设为y的父亲
}
}
int main()
{
//并查集
while(cin>>n>>m)
{
if(n==0&&m==0){break;}
// vector<vector<int>>vv(n,vector<int>(m,0));
init(n);
for(int j=0;j<m;j++)
{
cin>>x>>y;
uni(x,y);//并查集初始化
}
/*输出每个节点的father,调试
for(int i=0;i<=n;i++)
{
cout<<fat[i]<<" ";
}
cout<<endl;*/
//int num=count(fat.begin()+1,fat.begin()+n+1,0);
int num=0;
//int tmp=0;
for(int i=1;i<=n;i++)
{
if(fat[i]==i){num++;}//如果根节点是本身,说明自己是根,是单独一个连通图
}
if(num>1){cout<<"NO"<<endl;}
else cout<<"YES"<<endl;
}
return 0;
}