Problem:
Score : 100 points

Problem Statement

There is a directed graph G with N vertices and M edges.
The vertices are numbered 1, 2, \ldots, N, and for each i (1 \leq i \leq M), the i-th directed edge goes from Vertex x_i to y_i.
G does not contain directed cycles.

Find the length of the longest directed path in G.
Here, the length of a directed path is the number of edges in it.

Constraints

All values in input are integers.

2 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq x_i, y_i \leq N

All pairs (x_i, y_i) are distinct.

G does not contain directed cycles.

Input

Input is given from Standard Input in the following format:

N M
x_1 y_1
x_2 y_2
:
x_M y_M

Output

Print the length of the longest directed path in G.

Sample Input 1

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

Sample Output 1

3

The red directed path in the following figure is the longest:

Sample Input 2

6 3
2 3
4 5
5 6

Sample Output 2

2

The red directed path in the following figure is the longest:

Sample Input 3

5 8
5 3
2 3
2 4
5 2
5 1
1 4
4 3
1 3

Sample Output 3

3

The red directed path in the following figure is one of the longest:

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include<bits/stdc++.h>
using namespace std;

#define IOS ios_base::sync_with_stdio(false);cin.tie(NULL); 

#define ff first
#define ss second
#define pb push_back
#define pf push_front
#define mp make_pair
#define pu push
#define pp pop_back
#define in insert
#define ld long double
#define endl '\n'
#define debug cout << "Hold right there sparky.....\n";
#define forn(low,high,i) for(i=low;i<high;i++)
#define forrev(high,low,i) for(i = high; i>= low;i--)
#define trace(x) cerr << #x << ": " << x << " " << endl;

typedef long long int ll;
typedef unordered_map<int,int> umi;
typedef unordered_map<ll,ll> uml;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
vector <int> v[100001];
bool visited[100001];
int bfs(int n,int vertex)
{
    visited[vertex]=true;
    vector<int> v1;
    int max=0;
    v1.push_back(vertex);
    int dist[n+1];
    dist[vertex]=0;
    memset(dist,0,sizeof(dist));
    while(!v1.empty())
    {
        int temp=v1[0];
        v1.erase(v1.begin());
        visited[temp]=true;
        for(int i=0;i<v[temp].size();++i)
        {
            visited[v[temp][i]]=true;
            //cout<<v[temp][i]<<" ";
            int temp1=1+dist[temp];
            //cout<<temp<<" ";
            if(dist[v[temp][i]]<temp1)
               {
                   dist[v[temp][i]]=temp1;
                   if(max<temp1) max=temp1;
                   //cout<<dist[v[temp][i]]<<" ";
                   v1.push_back(v[temp][i]);
               }
        }
        //cout<<endl;
    }
    //int max=-1;
    //for(int i=1;i<=n;++i) if(dist[i]>max) max=dist[i];
   // sort(dist,dist+n,greater<int>());
    return max;
}
int main()
{IOS
int n,m;
cin>>n>>m;
bool visit[n+1];
memset(visit,false,sizeof(visit));
for(int i=1;i<=m;++i)
{
    int p,q;
    cin>>p>>q;
    v[p].push_back(q);
    visit[q]=true;
    
}
int max=-1;

memset(visited,false,sizeof(visited));
for(int i=1;i<=n;++i)
{
    if(visited[i]==false && visit[i]==false)
    {
        visited[i]=true;
        int temp=bfs(n,i);
        if(temp>max)
        max=temp;
    }
}
cout<<max;
}