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;
inline int read() {
  char ch = getchar();
  int x = 0, f = 1;
  while (ch < '0' || ch > '9') f = ch == '-' ? -1 : 1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * f;
}
const int MAXN = 510, MAXM = 1000010;
int h[MAXN], tot = 0;
struct edge {
  int v, nxt;
  edge() { v = nxt = 0; }
  edge(int v, int nxt) { this->v = v, this->nxt = nxt; }
} e[MAXM];
void add_edge(int x, int y) {
  tot++;
  e[tot].v = y;
  e[tot].nxt = h[x];
  h[x] = tot;
}
queue<int> q;
int indeg[MAXN], newindeg[MAXN];
int main(int argc, char *argv[]) {
  ios::sync_with_stdio(false);
  cin.tie(0);
  memset(h, 0, sizeof(h));
  tot = 0;
  memset(indeg, 0, sizeof(indeg));
  int n = read(), m = read();
  for (int _ = (1); _ <= (m); _ += (1)) {
    int u = read(), v = read();
    indeg[v]++;
    add_edge(u, v);
  }
  for (int x = (1); x <= (n); x += (1)) {
    for (int i = (1); i <= (n); i += (1))
      newindeg[i] = max(indeg[i] - (i == x), 0);
    for (int i = (1); i <= (n); i += (1))
      if (newindeg[i] == 0) q.push(i);
    int cnt = 0;
    while (!q.empty()) {
      int cur = q.front();
      q.pop();
      cnt++;
      for (int i = h[cur]; i; i = e[i].nxt) {
        int v = e[i].v;
        newindeg[v]--;
        if (newindeg[v] == 0) q.push(v);
      }
    }
    if (cnt == n) {
      puts("YES");
      return 0;
    }
  }
  puts("NO");
  return 0;
}
