#include <bits/stdc++.h>
using namespace std;
int i, j, k, l, s[1000005], n, m, tot, last[1000005], Next[1000005],
    to[1000005], dfn[1000005], low[1000005];
int vis[1000005], q[1000005], Q[1000005], q1[1000005], r, r1, G[1000005], T;
vector<int> gt;
int ans[1000005], A[1000005], B[1000005], a[1000005], b[1000005], x, y;
inline void add(int x, int y) {
  Next[++tot] = last[x];
  last[x] = tot;
  to[tot] = y;
}
inline void tarjan(int x) {
  dfn[x] = low[x] = ++tot;
  q[++r] = x;
  vis[x] = 1;
  for (int i = last[x]; i; i = Next[i]) {
    if (!dfn[to[i]])
      tarjan(to[i]), low[x] = min(low[x], low[to[i]]);
    else if (vis[to[i]])
      low[x] = min(low[x], low[to[i]]);
  }
  if (low[x] == dfn[x]) {
    ++T;
    while (q[r] != x) {
      G[q[r]] = T;
      vis[q[r]] = 0;
      r--;
      s[T]++;
    }
    G[q[r]] = T;
    vis[q[r]] = 0;
    r--;
    s[T]++;
  }
}
inline void bfs(int x) {
  int l = 0, r = 1;
  Q[1] = x;
  while (l < r) {
    int k = Q[++l];
    for (int i = last[k]; i; i = Next[i]) {
      if (!vis[to[i]]) vis[Q[++r] = to[i]] = 1;
    }
  }
}
inline bool check(int x, int y) {
  int s = 0;
  int p = x;
  while (x) {
    s += x & 1;
    x >>= 1;
  }
  x = y;
  while (x) {
    s -= x & 1;
    x >>= 1;
  }
  if (s > 0) return true;
  if (s < 0) return false;
  if (s == 0 && p != (1 << r1) - 1) return true;
  return false;
}
int main() {
  scanf("%d%d", &n, &m);
  if (n == 1) return puts("YES"), 0;
  for (i = 1; i <= m; i++) scanf("%d%d", &x, &y), add(x, y);
  tot = 0;
  for (i = 1; i <= n; i++)
    if (!dfn[i]) tarjan(i);
  for (i = 1; i <= n; i++)
    for (j = last[i]; j; j = Next[j]) {
      B[G[to[j]]]++, A[G[i]]++;
      if (G[to[j]] != G[i]) a[G[i]] = b[G[to[j]]] = 1;
    }
  for (i = 1; i <= T; i++)
    if (!A[i] && !B[i]) return puts("NO"), 0;
  for (i = 1; i <= n; i++) {
    if (!A[G[i]])
      gt.push_back(i);
    else if (!B[G[i]])
      q1[++r1] = i;
  }
  for (i = 1; i <= T; i++) {
    if (A[i] && B[i] && r1 && (!a[i] || !b[i])) return puts("NO"), 0;
  }
  if (!r1 && T > 1) return puts("NO"), 0;
  for (i = 1; i <= r1; i++) {
    for (j = 1; j <= n; j++) vis[j] = 0;
    bfs(q1[i]);
    for (j = 0; j < gt.size(); j++)
      if (vis[gt[j]]) ans[i] += (1 << (j));
  }
  for (i = 1; i < (1 << r1); i++) {
    int x = i;
    int s = 0, t = 1;
    while (x) {
      if (x & 1) s |= ans[t];
      t++;
      x >>= 1;
    }
    if (check(i, s)) return puts("NO"), 0;
  }
  puts("YES");
}
