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;
void dfs(vector<vector<int> > &adj, vector<int> &parent, int n, int &start,
         int &last, int source, vector<int> &stack) {
  stack[n] = 1;
  for (int i = 1; i < adj[n].size(); i++) {
    if (adj[n][i] != -1) {
      if (parent[i] == -1) {
        parent[i] = n;
        dfs(adj, parent, i, start, last, source, stack);
      } else if (stack[i] == 1 && start == 0) {
        if (i == source) parent[i] = n;
        start = i;
        last = n;
      }
    }
  }
  stack[n] = 0;
}
void cyclic(int v, vector<vector<int> > &adj, vector<int> &parent, int &start,
            int &last) {
  int a = 0, b = 0;
  for (int i = 1; i <= v; i++) {
    vector<int> stack(v + 1, 0);
    dfs(adj, parent, i, a, b, i, stack);
    if (a != 0) {
      start = a;
      last = b;
      return;
    }
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<int> > adj(n + 1, vector<int>(n + 1, -1));
  for (int i = 1; i <= m; i++) {
    int t1, t2;
    cin >> t1 >> t2;
    adj[t1][t2] = 1;
  }
  int start = 0;
  int last = 0;
  vector<int> parent(n + 1, -1);
  cyclic(n, adj, parent, start, last);
  if (start == 0)
    cout << "YES";
  else {
    vector<int> cycle;
    cycle.push_back(last);
    int temp = last;
    while (temp != start) {
      temp = parent[temp];
      cycle.push_back(temp);
    }
    bool b = false;
    int size = cycle.size();
    for (int i = 0; i < cycle.size(); i++) {
      vector<int> parent(n + 1, -1);
      int new_start = 0;
      int new_last = 0;
      adj[cycle[(i + 1) % size]][cycle[i]] = -1;
      cyclic(n, adj, parent, new_start, new_last);
      if (new_start == 0) {
        b = true;
        break;
      }
      adj[cycle[(i + 1) % size]][cycle[i]] = 1;
    }
    if (b)
      cout << "YES" << endl;
    else
      cout << "NO" << endl;
  }
  return 0;
}
