#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 1001
typedef int WeightType;
typedef int Elemtype;
typedef struct EdgeNode
{
int adjvex;
WeightType weight;
struct EdgeNode *next;
}EdgeNode;
typedef struct VexNode
{
EdgeNode *firstarc;
}VexNode, AdjList[MAXVEX];
typedef struct GraphADJ{
AdjList adjlist;
int numvex, numedge;
}GraphADJ;
void InitGraph(GraphADJ *G,int n)
{
int i;
G->numvex = n;
for(i=1; i<=n; i++)
G->adjlist[i].firstarc = NULL;
}
void InsertEdge(GraphADJ *G,int s,int t,int w)
{
EdgeNode *newn = (EdgeNode *)malloc(sizeof(EdgeNode));
newn->adjvex = t;
newn->weight = w;
newn->next = G->adjlist[s].firstarc;
G->adjlist[s].firstarc = newn;
}
int LocateEdge(GraphADJ G,int s,int t)
{
EdgeNode *p = G.adjlist[s].firstarc;
while(p!=NULL)
{
if(p->adjvex == t)
return 0;
p = p->next;
}
return 1;
}
int Create(GraphADJ *G,int n,int m)
{
int s,t,i,x;
int j=0;
int a[1010],visit[2000];
InitGraph(G,n);
for(i=1;i<=n;i++)
visit[i]=0;
for(i=0;i<m;i++)
{
scanf("%d%d",&s,&t);
x=LocateEdge(*G,s,t);
if(x==1)
{
InsertEdge(G,s,t,1);
InsertEdge(G,t,s,1);
}
}
EdgeNode *p;
i=1;
do
{
p=G->adjlist[i].firstarc;
visit[i]=1;
while(p!=NULL)
{
i=p->adjvex;
if(visit[i]!=1)
{
a[j++]=i;
visit[i]=1;
}
p=p->next;
}
j--;
if(j>=0)
i=a[j];
}while(j>=0);
for(i=1;i<=n;i++)
{
if(visit[i]==1);
else
return 0;
}
return 1;
}
void main()
{
int n,m,x;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
GraphADJ G;
x=Create(&G,n,m);
if(x)
printf("YES\n");
else
printf("NO\n");
}
}
/**************************************************************
Problem: 2191
User: admin
Language: C
Result: Accepted
Time:10 ms
Memory:1144 kb
****************************************************************/