#include <bits/stdc++.h>
using namespace std;
int inline read() {
  int num = 0, neg = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') neg = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    num = (num << 3) + (num << 1) + c - '0';
    c = getchar();
  }
  return num * neg;
}
const int maxn = 1000010, mod = 998244353;
int n, m, f[1 << 20], out[maxn], in[maxn], id[maxn], mx, sz[maxn];
vector<int> g[maxn];
void dfs(int x, int s) {
  if (id[x]) f[s] |= (1 << id[x] - 1);
  for (int i = 0; i < g[x].size(); i++) {
    int v = g[x][i];
    dfs(v, s);
  }
}
void FWT(int *A, int len, int opt) {
  for (int i = 1; i < (1 << len); i <<= 1)
    for (int j = 0; j < (1 << len); j += (i << 1))
      for (int k = 0; k < i; k++) A[i + j + k] = A[i + j + k] | A[j + k];
}
int main() {
  n = read();
  m = read();
  for (int i = 1; i <= m; i++) {
    int x = read(), y = read();
    g[x].push_back(y);
    out[x]++;
    in[y]++;
  }
  int cnt = 0;
  for (int i = 1; i <= n; i++)
    if (!out[i]) id[i] = ++cnt;
  cnt = 0;
  for (int i = 1; i <= n; i++)
    if (!in[i]) {
      dfs(i, 1 << cnt);
      cnt++;
    }
  FWT(f, cnt, 1);
  sz[0] = 0;
  for (int i = 1; i < (1 << cnt); i++) sz[i] = sz[i >> 1] + (i & 1);
  for (int i = 1; i < (1 << cnt) - 1; i++)
    if (sz[i] == sz[f[i]]) {
      printf("NO\n");
      return 0;
    }
  printf("YES\n");
  return 0;
}
