//并查集没什么好说的
#include<iostream>
#include<set>
using namespace std;
int father[1001];
void initialUnion()
{
for (int i = 0; i < 1001; i++)
{
father[i] = i;
}
}
int findFather(int x)
{
if (x == father[x]) return x;
else
{
father[x] = findFather(father[x]);
return father[x];
}
}
void unionFather(int x, int y)
{
int x_father = findFather(x);
int y_father = findFather(y);
father[y_father] = father[x_father];
}
int main()
{
int N, M;
while (scanf("%d %d",&N,&M)!=EOF)
{
if (N == 0 && M == 0)
{
break;
}
initialUnion();
for(int i=0;i<M;i++)
{
int x, y;
scanf("%d %d", &x, &y);
unionFather(x, y);
}
set<int>blocks;
for (int i = 1; i <= N; i++)
{
blocks.insert(findFather(i));
}
if (blocks.size() == 1)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
}