RT
import java.util.*;
public class Main {
public static class Node
{
public int index;
public ArrayList<Node> in=new ArrayList<Node>();
public ArrayList<Node> out=new ArrayList<Node>();
public Node(int index)
{
this.index=index;
}//index是这个node对象的编号
public void connect(Node east)
{
east.in.add(this);
out.add(east);
}//连接两个节点,从this指向east
public void disconnect(Node east)
{
east.in.remove(this);
out.remove(east);
}//断连
public void search(int a[],int b[])
{
b[0]++;//b是当前路径长,a是最长路径长,进来先b++
if(in.isEmpty())
{
if(b[0]>a[0])
{
a[0]=b[0];
}
}//入度为0时打擂台
else
{
for(Node node:in)
{
node.search(a, b);
}//入度不为0,“反向”深搜
}
b[0]--;//出去b--
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
Node nodes[]=new Node[in.nextInt()];//建立N长度数组
int M=in.nextInt();//读入M
for(int i=0;i<nodes.length;i++)
{
nodes[i]=new Node(i);
}//初始化,填充nodes[]
for(int i=0;i<M;i++)
{
int x=in.nextInt();
int y=in.nextInt();
nodes[x-1].connect(nodes[y-1]);
}//依次读入节点间关系,连接
for(int i=0;i<nodes.length;i++)
{
int a[]= {0};
nodes[i].search(a, new int[1]);
System.out.println(a[0]);
}//深搜并输出
}
}