#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5, M = (1 << 20) + 5;
template <typename T>
void read(T &x) {
  bool neg = false;
  unsigned char c = getchar();
  for (; (c ^ 48) > 9; c = getchar())
    if (c == '-') neg = true;
  for (x = 0; (c ^ 48) < 10; c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
  if (neg) x = -x;
}
struct line {
  int next, to;
} e[N];
int n, m, hd[N], cnt, k, s[25], t[25], f[N], a[M], pop[M];
bool iss[N], ist[N];
void adline(int u, int v) {
  e[cnt].to = v;
  e[cnt].next = hd[u];
  hd[u] = cnt++;
}
void dfs(int u) {
  if (f[u]) return;
  for (int i = hd[u]; ~i; i = e[i].next) {
    int v = e[i].to;
    dfs(v);
    f[u] |= f[v];
  }
}
int main() {
  read(n);
  read(m);
  for (int i = 0, i_end = n; i < i_end; ++i) hd[i] = -1, iss[i] = ist[i] = true;
  for (int i = 0, i_end = m; i < i_end; ++i) {
    int u, v;
    read(u);
    read(v);
    adline(--u, --v);
    ist[u] = false;
    iss[v] = false;
  }
  for (int i = 0, i_end = n; i < i_end; ++i)
    if (iss[i]) s[k++] = i;
  k = 0;
  for (int i = 0, i_end = n; i < i_end; ++i)
    if (ist[i]) t[k++] = i;
  for (int i = 0, i_end = k; i < i_end; ++i) f[t[i]] = 1 << i;
  for (int i = 0, i_end = k; i < i_end; ++i) dfs(s[i]), a[1 << i] = f[s[i]];
  for (int i = 1, i_end = 1 << k; i < i_end; ++i)
    pop[i] = pop[i ^ (i & -i)] + 1;
  for (int i = 1, i_end = (1 << k) - 1; i < i_end; ++i) {
    a[i] = a[i & -i] | a[i ^ (i & -i)];
    if (pop[a[i]] <= pop[i]) return puts("NO"), 0;
  }
  puts("YES");
  return 0;
}
