Buggy python submission (verdict: Time Limit Exceeded):
import sys
input=sys.stdin.readline
n,m=map(int,input().split())
G=[[] for i in range(n+1)]
flag=[1]*(n+1)
for i in range(m):
    x,y=map(int,input().split())
    G[x].append(y)
    flag[y]=0
# dp[i] node iからの最長パス
dp=[-1]*(n+1)
st=[]
for i in range(1,n+1):
    if flag[i]:
        st.append(i)
ans=0

def dfs(x):
    max_kyori=0
    dist=[-1]*(n+1)
    dist[x]=0
    stack=[x]
    while stack:
        a=stack.pop()
        kyori = dist[a]
        if G[a]!=[]:
            for t in G[a]:
                dist[t]=kyori+1
                max_kyori=max(max_kyori,kyori+1)
                stack.append(t)
    return max_kyori
kotae=0
for i in st:
    kotae=max(kotae,dfs(i))
print(kotae)

Fixed submission:
import sys
input = sys.stdin.readline
#bfsするからdequeじゃないとだめ
from collections import deque
n,m=map(int,input().split())
infi=10**10
#topological sort
#通常のグラフ構成のグラフ
graph1=[[]for _ in range(n+1)]
#入ってくる辺の数を記録するグラフ
graph2=[ 0 for _ in range(n+1)]
for _ in range(m):
    x,y=map(int,input().split())
    graph1[x].append(y)
    graph2[y]+=1
#start地点になるのは入ってくる辺の数が0の点
start=deque([])
for i in range(1,n+1):
    if graph2[i]==0:
        start.append(i)
#start地点から
#①topoリストに加える
#②隣接点の入ってくる辺の数を減らす
#③入ってくる辺の数が0になったらstartに加える
#を繰り返す
#※今回はtopoに加えるのは本質ではない。
#topoに加えていく順序で見ていきながら距離を入れていく。
# topo=[]
dist=[infi]*(n+1)
for i in start:
    dist[i]=0
while start:
    a=start.popleft()
    kyori=dist[a]
#     topo.append(a)
    for b in graph1[a]:
        graph2[b]-=1
        if graph2[b]==0:
            start.append(b)
            dist[b]=min(dist[b],dist[a]+1)
print(max(dist[1:]))

Buggy python submission (verdict: Time Limit Exceeded):
n,m=map(int,input().split())
G=[[] for i in range(n+1)]
flag=[1]*(n+1)
for i in range(m):
    x,y=map(int,input().split())
    G[x].append(y)
    flag[y]=0
# dp[i] node iからの最長パス
dp=[-1]*(n+1)
st=[]
for i in range(1,n+1):
    if flag[i]:
        st.append(i)
ans=0

def dfs(x):
    max_kyori=0
    dist=[-1]*(n+1)
    dist[x]=0
    stack=[x]
    while stack:
        a=stack.pop()
        kyori = dist[a]
        if G[a]!=[]:
            for t in G[a]:
                dist[t]=kyori+1
                max_kyori=max(max_kyori,kyori+1)
                stack.append(t)
    return max_kyori
kotae=0
for i in st:
    kotae=max(kotae,dfs(i))
print(kotae)

Fixed submission:
import sys
input = sys.stdin.readline
#bfsするからdequeじゃないとだめ
from collections import deque
n,m=map(int,input().split())
infi=10**10
#topological sort
#通常のグラフ構成のグラフ
graph1=[[]for _ in range(n+1)]
#入ってくる辺の数を記録するグラフ
graph2=[ 0 for _ in range(n+1)]
for _ in range(m):
    x,y=map(int,input().split())
    graph1[x].append(y)
    graph2[y]+=1
#start地点になるのは入ってくる辺の数が0の点
start=deque([])
for i in range(1,n+1):
    if graph2[i]==0:
        start.append(i)
#start地点から
#①topoリストに加える
#②隣接点の入ってくる辺の数を減らす
#③入ってくる辺の数が0になったらstartに加える
#を繰り返す
#※今回はtopoに加えるのは本質ではない。
#topoに加えていく順序で見ていきながら距離を入れていく。
# topo=[]
dist=[infi]*(n+1)
for i in start:
    dist[i]=0
while start:
    a=start.popleft()
    kyori=dist[a]
#     topo.append(a)
    for b in graph1[a]:
        graph2[b]-=1
        if graph2[b]==0:
            start.append(b)
            dist[b]=min(dist[b],dist[a]+1)
print(max(dist[1:]))