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 }&.max || 0
end

m.times do
  u, v = gets.split.map(&:to_i)
  if @edge[u].nil?
    @edge[u] = [v]
  else
    @edge[u] << v
  end
end
ans = 0
(1..n).each { |u| ans = dp(u) if dp(u) > ans }
puts ans
