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)DP(i)=DFS(i,N,NODE_CONNECT)
  ans=max(ans,DP(i) )
end do

print"(I0)",ans

contains

recursive function DFS(u,N,NODE_CONNECT)result(res)
integer u,res
integer N
integer,intent(in),dimension(1:N,1:N)::NODE_CONNECT
  if(DP(u) >= 0)then
    res=DP(u)
  else
    DP(u)=0
    do j=1,N
      if(u==j)cycle
      if(NODE_CONNECT(u,j)==1)then
        DP(u)=max(DP(u),DFS(j,N,NODE_CONNECT)+1)
      end if
  end do
  res=DP(u)
  endif
end function DFS
end