HDU3342
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int N,M;
vector<int> G[105];
int Count[105];
int ans[105],pos;
int first[105];
void TopoSort()
{
queue<int> q;
pos=0;
for(int i=0;i<N;i++)
{
if(Count[i]==0)q.push(i);
}
if(q.empty())return ;
memset(ans,0,sizeof(ans));
while(!q.empty())
{
int u=q.front(); q.pop();
ans[pos++]=u;
int d=G[u].size();
for(int i=0;i<d;i++)
{
int t=G[u][i];
if(--Count[t]==0)q.push(t);
}
}
}
int main()
{
while(~scanf("%d%d",&N,&M))
{
if(N==0 && M==0)break;
for(int i=0;i<N;i++)
G[i].clear();
memset(Count,0,sizeof(Count));
int u,v;
for(int i=0;i<M;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
Count[v]++;
}
TopoSort();
if(pos==N)printf("YES\n");
else printf("NO\n");
}
return 0;
}