#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
inline long long pow(long long a, long long b, long long p) {
  long long rtn = 1;
  while (b) {
    if (b & 1) rtn = rtn * a % p;
    a = a * a % p;
    b >>= 1;
  }
  return rtn;
}
long long inv(long long a, long long p) { return pow(a, p - 2, p); }
void makedata() {
  freopen("input.txt", "w", stdout);
  srand((unsigned)time(NULL));
  fclose(stdout);
}
vector<int> G[1000005], ve, vk;
bool source[1000005], sink[1000005], f[25][25], a[1000005], b[25];
void dfs(int x) {
  if (a[x]) return;
  a[x] = true;
  for (auto &y : G[x]) dfs(y);
}
int main() {
  std::ios::sync_with_stdio(0), cin.tie(0);
  int n, m;
  cin >> n >> m;
  memset(source, true, sizeof(source));
  memset(sink, true, sizeof(sink));
  for (int i = (1); i <= (m); i++) {
    int x, y;
    cin >> x >> y;
    G[x].push_back(y);
    source[y] = false;
    sink[x] = false;
  }
  for (int i = (1); i <= (n); i++) {
    if (source[i]) ve.push_back(i);
    if (sink[i]) vk.push_back(i);
  }
  for (int i = (0); i <= (ve.size() - 1); i++) {
    memset(a, false, sizeof(a));
    dfs(ve[i]);
    for (int j = (0); j <= (vk.size() - 1); j++) {
      if (a[vk[j]]) f[i][j] = true;
    }
  }
  int p = ve.size();
  for (int i = (1); i <= ((1 << p) - 2); i++) {
    int x = 0, y = 0;
    memset(b, false, sizeof(b));
    for (int j = (0); j <= (p); j++) {
      if (i & (1 << j)) {
        x++;
        for (int k = (0); k <= (p); k++) b[k] |= f[j][k];
      }
    }
    for (int j = (0); j <= (p); j++)
      if (b[j]) y++;
    if (x >= y) {
      cout << ("NO") << endl;
      return 0;
    }
  }
  cout << ("YES") << endl;
  return 0;
}
