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.

Examples

Input

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


Output

3


Input

6 3
2 3
4 5
5 6


Output

2


Input

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


Output

3

import java.util.*;


public class Main{ 
	static int height[]=new int[100001];
   public static void main(String args[]) {
	Scanner s=new Scanner(System.in);
	 int n=s.nextInt();
	 int m=s.nextInt();
	 ArrayList<ArrayList<Integer>> arr=new ArrayList<>(n+1);
	 for(int i=0;i<=n;i++) {
		 ArrayList<Integer> temp=new ArrayList<>();
		 arr.add(temp);
	 }
	 
	 for(int i=0;i<m;i++) {
		 int x=s.nextInt();
		 int y=s.nextInt();
		 arr.get(x).add(y);
	 }
	 boolean visited[]=new boolean[n+1];
	
	 for(int i=1;i<=n;i++) {
		 if(!visited[i])
	   dfs(arr,i,0,visited);
	 }
	 int ans=0;
	 for(int i=0;i<=n;i++) {
		 if(ans<height[i]) {
			 ans=height[i];
		 }
	 }
	 System.out.print(ans-1);
	 
   }
   public static void dfs(ArrayList<ArrayList<Integer>> arr,int start,int parent,boolean visited[]) {
	   visited[start]=true;
	  
	   
	   ArrayList<Integer> temp=arr.get(start);
	   for(int i=0;i<temp.size();i++) {
		   if(!visited[temp.get(i)]) {
			   dfs(arr,temp.get(i),start,visited);
		   }
	   }
	 
	   for(int i=0;i<temp.size();i++) {
		   height[start]=Math.max(height[start], height[temp.get(i)]);
	   }
	   height[start]=1+height[start];
	   
	   
   }
}