You are given a [directed graph](https://en.wikipedia.org/wiki/Directed_graph) consisting of n vertices and m edges (each edge is directed, so it can be traversed in only one direction). You are allowed to remove at most one edge from it.

Can you make this graph [acyclic](https://en.wikipedia.org/wiki/Directed_acyclic_graph) by removing at most one edge from it? A directed graph is called acyclic iff it doesn't contain any cycle (a non-empty path that starts and ends in the same vertex).

Input

The first line contains two integers n and m (2 ≤ n ≤ 500, 1 ≤ m ≤ min(n(n - 1), 100000)) — the number of vertices and the number of edges, respectively.

Then m lines follow. Each line contains two integers u and v denoting a directed edge going from vertex u to vertex v (1 ≤ u, v ≤ n, u ≠ v). Each ordered pair (u, v) is listed at most once (there is at most one directed edge from u to v).

Output

If it is possible to make this graph acyclic by removing at most one edge, print YES. Otherwise, print NO.

Examples

Input

3 4
1 2
2 3
3 2
3 1


Output

YES


Input

5 6
1 2
2 3
3 2
3 1
2 1
4 5


Output

NO

Note

In the first example you can remove edge <image>, and the graph becomes acyclic.

In the second example you have to remove at least two edges (for example, <image> and <image>) in order to make the graph acyclic.
#include <bits/stdc++.h>
using namespace std;
const int N = 505;
const int M = 1e5 + 5;
int dfn[N], low[N], sta[N], top, be[N], col, cnt, sum, wz;
int n, m, x[M], y[M], flag[N], a1, a2, a3;
int fi[N], ne[M], j[M], step;
bool ans, tmp, ls;
void addedge(int fr, int to) {
  j[++step] = to;
  ne[step] = fi[fr];
  fi[fr] = step;
}
void tarjan(int ro) {
  dfn[ro] = low[ro] = ++col;
  sta[++top] = ro;
  for (int u = fi[ro]; u; u = ne[u])
    if (!dfn[j[u]]) {
      tarjan(j[u]);
      low[ro] = min(low[ro], low[j[u]]);
    } else if (!be[j[u]])
      low[ro] = min(low[ro], dfn[j[u]]);
  if (low[ro] == dfn[ro]) {
    int tmp = 0;
    ++cnt;
    do {
      be[sta[top]] = cnt;
      tmp++;
    } while (sta[top--] != ro);
    if (tmp > 1) {
      wz = cnt;
      sum++;
    }
  }
}
bool dfs(int ro, int ban) {
  if (flag[ro] == a2) return true;
  if (flag[ro] == a1) return false;
  bool pd;
  flag[ro] = a1;
  for (int u = fi[ro]; u; u = ne[u]) {
    if (u == ban) continue;
    pd = dfs(j[u], ban);
    if (!pd) return false;
  }
  flag[ro] = a2;
  return true;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d", &x[i], &y[i]);
    addedge(x[i], y[i]);
  }
  for (int i = 1; i <= n; ++i)
    if (!dfn[i]) tarjan(i);
  if (sum >= 2)
    return puts("NO");
  else if (sum == 0)
    return puts("YES");
  step = 0;
  memset(fi, 0, sizeof(fi));
  for (int i = 1; i <= m; ++i)
    if (be[x[i]] == be[y[i]] && be[x[i]] == wz) addedge(x[i], y[i]);
  for (int i = 1; i <= step; ++i) {
    tmp = 1;
    a1 = i * 3 - 2;
    a2 = i * 3 - 1;
    a3 = i * 3 - 0;
    for (int j = 1; j <= n; ++j)
      if (flag[j] != a2) {
        ls = dfs(j, i);
        if (!ls) {
          tmp = 0;
          break;
        }
      }
    if (tmp) {
      ans = 1;
      break;
    }
  }
  if (ans)
    puts("YES");
  else
    puts("NO");
  return 0;
}
