N, M = gets.chomp.split.map(&:to_i)

MEMO = Array.new(N, nil)

G = Array.new(N) { [] }

M.times do
  x, y = gets.chomp.split.map(&:to_i)

  G[x - 1] << y - 1
end

def calc(i)
  return MEMO[i] if MEMO[i]

  return MEMO[i] = 0 if G[i].empty?

  MEMO[i] = G[i].map {|j| calc(j) }.max + 1
end

print N.times.map {|i| calc(i) }.max
