#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
int n, m, t;
int cc[N];
vector<int> h[N];
int din[N], dout[N];
void eadd_h(int u, int v) {
  h[u].push_back(v);
  ++dout[u];
  ++din[v];
}
void dfs(int u) {
  cc[u] |= t;
  for (int v : h[u]) dfs(v);
}
vector<int> g[44];
void eadd_g(int u, int v) { g[u].push_back(v); }
int ccount, tt = 0;
stack<int> stk;
int scc(vector<int> &dt, vector<bool> &mk, int u) {
  int lw = dt[u] = ++tt;
  stk.push(u);
  mk[u] = true;
  for (int v : g[u])
    if (!dt[v]) {
      int nl = scc(dt, mk, v);
      lw = min(lw, nl);
    } else if (mk[v])
      lw = min(lw, dt[v]);
  if (dt[u] == lw) {
    ++ccount;
    while (stk.top() != u) {
      mk[stk.top()] = false;
      stk.pop();
    }
    mk[stk.top()] = false;
    stk.pop();
  }
  return lw;
}
int main() {
  scanf("%d %d", &n, &m);
  int st = clock();
  for (int i = 1; i <= m; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    eadd_h(u, v);
  }
  vector<int> src, snk;
  bool lonely = false;
  t = 1;
  for (int i = 1; i <= n; ++i) {
    if (!din[i]) src.emplace_back(i), dfs(i), t <<= 1;
    if (!dout[i]) snk.emplace_back(i);
    if (!din[i] && !dout[i]) lonely = true;
  }
  if (lonely && t > 1) return !(cout << "NO\n");
  int nn = ((int)(src).size());
  for (int i = 0; i < ((int)(src).size()); ++i)
    for (int j = 0; j < ((int)(snk).size()); ++j)
      if ((cc[snk[j]] >> i) & 1) eadd_g(i, nn + j);
  assert(((int)(src).size()) == ((int)(snk).size()));
  vector<int> who(((int)(src).size()));
  for (int i = 0; i < ((int)(who).size()); ++i) who[i] = i;
  vector<int> dt(nn << 1, 0);
  vector<bool> mk(nn << 1, false);
  while (clock() - st <= CLOCKS_PER_SEC * 6.5) {
    random_shuffle((who).begin(), (who).end());
    for (int i = 0; i < ((int)(who).size()); ++i) eadd_g(nn + i, who[i]);
    ccount = 0, tt = 0;
    fill((dt).begin(), (dt).end(), 0);
    fill((mk).begin(), (mk).end(), false);
    while (((int)(stk).size())) stk.pop();
    for (int i = 0, ii = nn << 1; i < ii && ccount <= 1; ++i)
      if (!dt[i]) scc(dt, mk, i);
    if (ccount > 1) {
      return !(cout << "NO\n");
    }
    for (int i = 0; i < ((int)(snk).size()); ++i) g[nn + i].pop_back();
  }
  cout << "YES\n";
  return 0;
}
