n, m = gets.split.map(&:to_i)
@edge = Array.new(n+1) { [] }
@maxes = Array.new(n+1)
def dp(x)
  return @maxes[x] if @maxes[x]
  @maxes[x] = (@edge[x].map{ |v| dp(v) + 1 } + [0]).max
end

m.times do
  u, v = gets.split.map(&:to_i)
  @edge[u] << v
end
puts (1..n).map{ |u| @maxes[u] ? @maxes[u] : dp(u) }.max
