/*
* File: hdu3342.cpp,拓扑排序
* Author: chenjiang
*
* Created on 2010年5月10日, 下午1:49
*/
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define _max 105
int n, m;
vector<int>v[_max];
int indegree[_max];
bool top_sort() {
int i, j;
queue<int>Q;
for (i = 0; i < n; i++) {
if (indegree[i] == 0)Q.push(i);
}
int ans = 0;
while (!Q.empty()) {
int temp = Q.front();
Q.pop();
ans++;
for (i = 0; i < v[temp].size(); i++) {
indegree[v[temp][i]]--;
if (indegree[v[temp][i]] == 0)Q.push(v[temp][i]);
}
}
if (ans < n)return 0;
else return 1;
}
/*
*
*/
int main(int argc, char** argv) {
int i, j;
while (cin >> n >> m) {
if (n == 0 && m == 0)break;
for (i = 0; i < n; i++) {
v[i].clear();
indegree[i] = 0;
}
for (i = 1; i <= m; i++) {
int a, b;
cin >> a >> b;
v[a].push_back(b);
indegree[b]++;
}
bool flag = top_sort();
if (flag)cout << "YES" << endl;
else cout << "NO" << endl;
}
return (EXIT_SUCCESS);
}