integer N,M
integer,allocatable,dimension(:)::X,Y
integer,allocatable,dimension(:)::DP
integer ans
!読み込み
read*,N,M
allocate(X(n),Y(n))
allocate(DP(N))

do i=1,M
  read*,X(i),Y(i)
end do
!読み込み終了

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

print"(I0)",ans

contains

recursive function DFS(u,N,X,Y)result(res)
integer u,res
integer N
integer,dimension(:)::X,Y
  if(DP(u) >= 0)then
    res=DP(u)
  else
    DP(u)=0
    do j=1,size(x)
      if(x(j)==u)then
      DP(u)=max(DP(u),DFS(y(j),N,X,Y)+1)
      endif
    end do
  res=DP(u)
  endif
end function DFS
end