#include<iostream>
#include<vector>
#include<stack>
using namespace std;
class Hdu3342{
public:
void initial(int n, int m);
void read_case();
bool topological_sort();
void print_result();
private:
vector<int> vec[101];//节点的邻接表
int in[101];//保存节点的入度
int member_num;
int test_num;
};
void Hdu3342::initial(int n, int m){
for (int i = 0; i < 101; i++){
vec[i].clear();
}
memset(in, 0, sizeof(in));
member_num = n;
test_num = m;
}
void Hdu3342::read_case(){
int m, n;
for (int i = 0; i < test_num; i++){
cin >> m >> n;
vec[m].push_back(n);
in[n]++;//入度加1
}
}
bool Hdu3342::topological_sort(){
stack<int> stk;
int count = 0;//统计输出顶点的个数
for (int i = 0; i < member_num; i++){
if (in[i] == 0){
stk.push(i);//将入度为0的顶点入栈
}
}
while (!stk.empty()){
int tmp = stk.top();
stk.pop();
count++;
for (int i = 0; i < vec[tmp].size(); i++){//对此顶点弧表遍历
if (--in[vec[tmp][i]] == 0)
stk.push(vec[tmp][i]);
}
}
if (count == member_num)//如果count小于member_num,说明存在环
return true;
return false;
}
void Hdu3342::print_result(){
if (topological_sort())
cout << "YES" << endl;
else
cout << "NO" << endl;
}
int main(){
Hdu3342 x;
int m, n;
while (cin >> m >> n && (m || n)){
x.initial(m, n);
x.read_case();
x.print_result();
}
return 0;
}