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 abs(x) (x<0?(-x):x)
#define F(i,L,R) for (int i = L; i < R; i++)
#define FE(i,L,R) for (int i = L; i <= R; i++)
#define RF(i,L,R) for (int i = L; i > R; i--)
#define RFE(i,L,R) for (int i = L; i >= R; i--)
#define getI(a) scanf("%d", &a)
#define getII(a,b) scanf("%d%d", &a, &b)
#define getIII(a,b,c) scanf("%d%d%d", &a, &b, &c)
#define VgetI(n) int (n); scanf("%d",&(n))
#define VgetII(n,m) int (n),(m); scanf("%d %d",&(n),&(m))
#define VgetIII(n,m,k) int (n),(m),(k); scanf("%d %d %d",&(n),&(m),&(k))
#define ll long long
#define INF 1000000000000000000
#define nINF -2000000000
#define MOD 1e9+7
#define PI 3.1415926535897932384626
vector<int> edge[100005];
int n,m,dp[100005],vis[100005];
struct p{
	int id,dis;
};
void bfs(int id,int depth){
	queue<p> Q;
	dp[id]=max(dp[id],depth);
	Q.push((p){id,depth});
	while(!Q.empty()){
		p now=Q.front();
		Q.pop();
		F(i,0,edge[now.id].size()){
			dp[edge[now.id][i]]=max(dp[edge[now.id][i]],now.dis+1);
			Q.push((p){edge[now.id][i],dp[edge[now.id][i]]});
		}
	}
	return;
}
int main(){
	while(~getII(n,m)){
		FE(i,1,n){
			dp[i]=0,vis[i]=0;
			edge[i].clear();
		}
		F(i,0,m){
			VgetII(u,v);
			edge[u].push_back(v);
		}
		FE(i,1,n) if(!vis[i]) bfs(i,0);
		int ans=-1;
		FE(i,1,n) if(dp[i]>ans) ans=dp[i];
		printf("%d\n",ans);
	}
}