#include <bits/stdc++.h>
using namespace std;
const long long MAX = 1e6 + 5;
const long long MAX2 = 1e7 + 5;
vector<long long> v[MAX];
long long vis[MAX];
long long ind[MAX];
long long oud[MAX];
long long cou = 0;
long long tot = 0;
long long skin[MAX];
long long nob[MAX2];
long long dp[MAX2];
long long curx = 0;
void pre() {
  long long a, b, c, i;
  nob[0] = 0;
  for (i = 1; i < MAX2; i++) nob[i] = nob[(i ^ (i & (-i)))] + 1;
}
void dfs(long long x) {
  if (oud[x] == 0) tot++, curx |= skin[x];
  vis[x] = cou;
  for (auto z : v[x]) {
    if (vis[z] == cou) continue;
    dfs(z);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout << setprecision(25);
  long long n, m, a, b, c, d, i, j, k;
  cin >> n >> m;
  pre();
  for (i = 0; i < m; i++) {
    cin >> a >> b;
    v[a].push_back(b);
    ind[b]++;
    oud[a]++;
  }
  vector<long long> sou;
  long long ou = 0;
  vector<long long> sk;
  for (i = 1; i <= n; i++) {
    if (ind[i] == 0) sou.push_back(i);
    if (oud[i] == 0) skin[i] = (1ll << ou), ou++, sk.push_back(i);
  }
  dp[0] = 0;
  a = 1;
  b = 0;
  c = sou.size();
  c = 1ll << c;
  c--;
  for (auto z : sou) {
    curx = 0;
    cou++;
    dfs(z);
    b++;
    ;
    for (i = 0; i < a; i++) {
      dp[i + a] = dp[i] | curx;
      if (nob[dp[i + a]] <= nob[i + a]) {
        if ((i + a) != c) {
          cout << "NO";
          return 0;
        }
      }
    }
    a <<= 1;
  };
  cout << "YES";
  return 0;
}
