#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

int n,m;

struct node
{
	vector<int> adj[100];
	int indeg[100];
}p;

void add(node &N,int u,int v)
{
	N.adj[u].push_back(v);
	N.indeg[v]++;
}

int toposort(node N)
{
	int count=0,i;
	queue<int> q;
	for(i=0;i<n;i++)
	{
		if(!N.indeg[i])
			q.push(i);
	}
	while(!q.empty())
	{
		count++;
		int x=q.front();
		q.pop();
		for(vector<int>::iterator it=N.adj[x].begin();it!=N.adj[x].end();it++)
			if(!(--N.indeg[*it]))
				q.push(*it);
	}
	if(count==n)
		return 1;
	else
		return 0;
}

int main()
{
	int i,u,v;
	while(scanf("%d%d",&n,&m)!=EOF,n)
	{
		for(i=0;i<n;i++)
		{
			p.adj[i].clear();
			p.indeg[i]=0;
		}
		while(m--)
		{
			scanf("%d%d",&u,&v);
			add(p,u,v);
		}
		if(toposort(p))
			puts("YES");
		else
			puts("NO");
	}
	return 0;
}
/**************************************************************
	Problem: 2231
	User: admin
	Language: C++
	Result: Accepted
	Time:14 ms
	Memory:1268 kb
****************************************************************/