#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
vector<int> edge[501];//邻接链表
queue<int> q;//保存入度为0的节点
int indegree[501];//节点入度数组
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&n!=0||m!=0){
for(int i=0;i<n;i++){
indegree[i]=0;
edge[i].clear();//初始化入度数组和邻接链表
}
for(int i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);//输入边 构成图
indegree[b]++;
edge[a].push_back(b);
}
int cnt=0;
while(!q.empty())//清空队列
q.pop();
for(int i=0;i<n;i++)
if(indegree[i]==0) q.push(i);//若入度为0,压入队列中
while(!q.empty()){
int nowp=q.front();//读出对头节点编号
q.pop();//弹出队头元素,即将该节点删除
cnt++;//记录能输出的节点个数
for(int i=0;i<edge[nowp].size();i++){//遍历该结点相邻的结点
indegree[edge[nowp][i]]--;//该节点已删除则代表相邻节点入度-1
if(indegree[edge[nowp][i]]==0)
q.push(edge[nowp][i]);
}
}
if(cnt==n) puts("YES");//节点全部输出,无环
else puts("NO");//节点未完全输出,剩余节点入度均不为0,有环
}
return 0;
}
3 2
0 1
1 2
2 2
0 1
1 0
0 0