# -*- coding: utf-8 -*-

"""

Created on Sat Jan 19 16:05:26 2019

DP_G

@author: maezawa

"""

import sys

sys.setrecursionlimit(10**7)



n, m = list(map(int, input().split()))

v = [-1]*(n+1)

adj = [[] for _ in range(n+1)]

for _ in range(m):

    i, j = list(map(int, input().split()))

    adj[i].append(j)

    

def dfs(vi):

    if v[vi] != -1:

        return v[vi]

    res = 0

    for nb in adj[vi]:

        res0 = dfs(nb) +1

        if res < res0:

            res = res0

    v[vi] = res

    return res



ans = 0

for node in range(1, n+1):

    current = dfs(node)

    if current > ans:

        ans = current

print(ans)

    

# -*- coding: utf-8 -*-

"""

Created on Sun Mar 17 11:58:20 2019

DP_G

@author: maezawa

"""

import sys

sys.setrecursionlimit(10**6)



memo = [-1] * (10**5+100)



def rec(nx):

    if memo[nx] > -1:

        return memo[nx]

    depth = 0

    for edge in edges[nx]:

        nrec = rec(edge) + 1

        if nrec > depth:

            depth = nrec

    memo[nx] = depth

    return depth



n, m = list(map(int, input().split()))

edges = [[] for _ in range(n)]

for _ in range(m):

    x, y = list(map(int, input().split()))

    edges[x-1].append(y-1)

    

maxdepth = 0

for node in range(n):

    depth = rec(node)

    if maxdepth < depth:

        maxdepth = depth

        

print(maxdepth)

# -*- coding: utf-8 -*-
"""
Created on Sat Jan 19 16:05:26 2019
DP_G
@author: maezawa
"""
import sys

sys.setrecursionlimit(10**7)
n, m = list(map(int, input().split()))
v = [-1] * (n + 1)
adj = [[] for _ in range(n + 1)]
for _ in range(m):
    i, j = list(map(int, input().split()))
    adj[i].append(j)


def dfs(vi):
    if v[vi] != -1:
        return v[vi]
    res = 0
    for nb in adj[vi]:
        res0 = dfs(nb) + 1
        if res < res0:
            res = res0
    v[vi] = res
    return res


ans = 0
for node in range(1, n + 1):
    current = dfs(node)
    if current > ans:
        ans = current
print(ans)

# -*- coding: utf-8 -*-
"""
Created on Sun Mar 17 11:58:20 2019
DP_G
@author: maezawa
"""
import sys

sys.setrecursionlimit(10**6)
memo = [-1] * (10**5 + 100)


def rec(nx):
    if memo[nx] > -1:
        return memo[nx]
    depth = 0
    for edge in edges[nx]:
        nrec = rec(edge) + 1
        if nrec > depth:
            depth = nrec
    memo[nx] = depth
    return depth


n, m = list(map(int, input().split()))
edges = [[] for _ in range(n)]
for _ in range(m):
    x, y = list(map(int, input().split()))
    edges[x - 1].append(y - 1)
maxdepth = 0
for node in range(n):
    depth = rec(node)
    if maxdepth < depth:
        maxdepth = depth
print(maxdepth)

-Created on Sat Jan 19 16:05:26 2019 +Created on Sun Mar 17 11:58:20 2019 -sys.setrecursionlimit(10**7) -n, m = list(map(int, input().split())) -v = [-1] * (n + 1) -adj = [[] for _ in range(n + 1)] -for _ in range(m): -    i, j = list(map(int, input().split())) -    adj[i].append(j) +sys.setrecursionlimit(10**6) +memo = [-1] * (10**5 + 100) -def dfs(vi): -    if v[vi] != -1: -        return v[vi] -    res = 0 -    for nb in adj[vi]: -        res0 = dfs(nb) + 1 -        if res < res0: -            res = res0 -    v[vi] = res -    return res +def rec(nx): +    if memo[nx] > -1: +        return memo[nx] +    depth = 0 +    for edge in edges[nx]: +        nrec = rec(edge) + 1 +        if nrec > depth: +            depth = nrec +    memo[nx] = depth +    return depth -ans = 0 -for node in range(1, n + 1): -    current = dfs(node) -    if current > ans: -        ans = current -print(ans) +n, m = list(map(int, input().split())) +edges = [[] for _ in range(n)] +for _ in range(m): +    x, y = list(map(int, input().split())) +    edges[x - 1].append(y - 1) +maxdepth = 0 +for node in range(n): +    depth = rec(node) +    if maxdepth < depth: +        maxdepth = depth +print(maxdepth)