#include #include #include #include using namespace std; const int maxn = 105; const int maxm = 10005; int n, m, id, done; int in[maxn], head[maxn], next[maxm], e[maxm]; bool vis[maxn]; inline void add_edge(const int &x, const int &y) { next[++id] = head[x]; head[x] = id; e[id] = y; } bool bfs() { queue q; int i, now; for (i = 1; i <= n; ++i) if (!in[i]) { q.push(i); vis[i] = true; ++done; } if (done == n) return true; while (!q.empty()) { now = q.front(); q.pop(); for (i = head[now]; i != -1; i = next[i]) { int &v(e[i]); if (!vis[v] && !(--in[v])) { q.push(v); vis[v] = true; if (++done == n) return true; } } } return false; } int main() { int i, x, y; while (scanf("%d%d", &n, &m) == 2) { id = done = 0; memset(in, 0, sizeof in); memset(head, -1, sizeof head); memset(next, -1, sizeof next); memset(vis, 0, sizeof vis); for (i = 1; i <= m; ++i) { scanf("%d%d", &x, &y); ++in[x]; add_edge(y, x); } puts(bfs() ? "YES" : "NO"); } return 0; }