integer N,M
integer X,Y
integer,allocatable,dimension(:,:)::NODE_CONNECT
integer,allocatable,dimension(:)::DP
integer ans
!読み込み
read*,N,M
allocate(NODE_CONNECT(N,N))
allocate(DP(N))
NODE_CONNECT(:,:)=0
do i=1,M
  read*,X,Y
  NODE_CONNECT(X,Y)=1
end do
!読み込み終了

DP(:)= -1
!DP[i]とはノードiからのびる経路のうち最短のもの
!まだ調べていない状態は-1とする
ans = 0
do i=1,N
  if(DP(i)==-1)then
    call dfs(i)
  end if
  ans=max(ans,DP(i) )
end do

print"(I0)",ans,DP

contains

recursive subroutine DFS(u)
integer u
  if(DP(u)/=-1)return
  
  DP(u)=0
  do i=1,N
    if(NODE_CONNECT(u,i)==1)then
      if(DP(i)==-1)then
        call DFS(i)
      end if
      DP(u)=max(DP(u),DP(i)+1)
    end if
  end do
  return
end subroutine DFS
end