import sys

import collections



# input処理を高速化する

input = sys.stdin.readline



def chmax(a, b):

    """ 最大値を返す関数 """

    if a >= b:

        return a

    else:

        return b



def main():  

    # 入力

    N, M = list(map(int, input().split()))

    # 隣接関係は隣接リストで管理する

    lst_edge = [[] for _ in range(N)]

    # 各頂点の入力辺の本数

    deg = [0] * N  

    for _ in range(M):

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

        # 最初のindexをゼロにする

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

        deg[y-1] += 1

    

    # 入力辺を持たない頂点をqueueに入れる

    que = collections.deque()

    for v in range(N):

        if deg[v] == 0:

            que.append(v)



    # 各頂点の最初に入力辺を持たなかった点からの距離

    dp = [0] * N  



    while len(que) > 0:

        v = que.popleft()

        lst_nv = lst_edge[v]

        for nv in lst_nv:

            # エッジ(v, nv)をグラフから削除する

            deg[nv] -= 1

            if deg[nv] == 0:

                # エッジがなくなったことで、入力辺がなくなったらqueueに入れる

                que.append(nv)

                # 最初に入力辺を持たなかった点からの距離

                dp[nv] = chmax(dp[nv], dp[v] + 1)

    

    print((max(dp)))





main()
import sys

import collections



# input処理を高速化する

input = sys.stdin.readline



def chmax(a, b):

    """ 最大値を返す関数 """

    if a >= b:

        return a

    return b



def main():

    # 入力

    N, M = list(map(int, input().split()))

    # 隣接関係は隣接リストで管理する

    lst_edge = [[] for _ in range(N)]

    # 各頂点の入力辺の本数

    deg = [0] * N

    for _ in range(M):

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

        # 最初のindexをゼロにする

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

        deg[y-1] += 1



    # 入力辺を持たない頂点をqueueに入れる

    que = collections.deque()

    for v in range(N):

        if deg[v] == 0:

            que.append(v)



    # 各頂点の最初に入力辺を持たなかった点からの距離

    dp = [0] * N



    while que:

        v = que.popleft()

        lst_nv = lst_edge[v]

        for nv in lst_nv:

            # エッジ(v, nv)をグラフから削除する

            deg[nv] -= 1

            if deg[nv] == 0:

                # エッジがなくなったことで、入力辺がなくなったらqueueに入れる

                que.append(nv)

                # 最初に入力辺を持たなかった点からの距離

                dp[nv] = chmax(dp[nv], dp[v] + 1)



    print((max(dp)))



main()

import sys
import collections

# input処理を高速化する
input = sys.stdin.readline


def chmax(a, b):
    """最大値を返す関数"""
    if a >= b:
        return a
    else:
        return b


def main():
    # 入力
    N, M = list(map(int, input().split()))
    # 隣接関係は隣接リストで管理する
    lst_edge = [[] for _ in range(N)]
    # 各頂点の入力辺の本数
    deg = [0] * N
    for _ in range(M):
        x, y = list(map(int, input().split()))
        # 最初のindexをゼロにする
        lst_edge[x - 1].append(y - 1)
        deg[y - 1] += 1
    # 入力辺を持たない頂点をqueueに入れる
    que = collections.deque()
    for v in range(N):
        if deg[v] == 0:
            que.append(v)
    # 各頂点の最初に入力辺を持たなかった点からの距離
    dp = [0] * N
    while len(que) > 0:
        v = que.popleft()
        lst_nv = lst_edge[v]
        for nv in lst_nv:
            # エッジ(v, nv)をグラフから削除する
            deg[nv] -= 1
            if deg[nv] == 0:
                # エッジがなくなったことで、入力辺がなくなったらqueueに入れる
                que.append(nv)
                # 最初に入力辺を持たなかった点からの距離
                dp[nv] = chmax(dp[nv], dp[v] + 1)
    print((max(dp)))


main()

import sys
import collections

# input処理を高速化する
input = sys.stdin.readline


def chmax(a, b):
    """最大値を返す関数"""
    if a >= b:
        return a
    return b


def main():
    # 入力
    N, M = list(map(int, input().split()))
    # 隣接関係は隣接リストで管理する
    lst_edge = [[] for _ in range(N)]
    # 各頂点の入力辺の本数
    deg = [0] * N
    for _ in range(M):
        x, y = list(map(int, input().split()))
        # 最初のindexをゼロにする
        lst_edge[x - 1].append(y - 1)
        deg[y - 1] += 1
    # 入力辺を持たない頂点をqueueに入れる
    que = collections.deque()
    for v in range(N):
        if deg[v] == 0:
            que.append(v)
    # 各頂点の最初に入力辺を持たなかった点からの距離
    dp = [0] * N
    while que:
        v = que.popleft()
        lst_nv = lst_edge[v]
        for nv in lst_nv:
            # エッジ(v, nv)をグラフから削除する
            deg[nv] -= 1
            if deg[nv] == 0:
                # エッジがなくなったことで、入力辺がなくなったらqueueに入れる
                que.append(nv)
                # 最初に入力辺を持たなかった点からの距離
                dp[nv] = chmax(dp[nv], dp[v] + 1)
    print((max(dp)))


main()

-    else: -        return b +    return b -    while len(que) > 0: +    while que: