bool f[maxn][maxn][maxn]; // f[t][u][v] : 存在一条长度为 2^t 的路径,从 u 到 v ll dis[maxn][maxn];
voidsolve( ){ int n = read( ), m = read( ); for( int i = 1; i <= m; ++ i ) { int u = read( ), v = read( ); f[0][u][v] = 1; }
for( int t = 1; t <= 30; ++ t ) { for( int k = 1; k <= n; ++ k ) { for( int u = 1; u <= n; ++ u ) { for( int v = 1; v <= n; ++ v ) { f[t][u][v] |= f[t-1][u][k] && f[t-1][k][v]; } } } }
for( int i = 1; i <= n; ++ i ) { for( int j = 1; j <= n; ++ j ) { if( i == j ) dis[i][j] = 0; else dis[i][j] = inf; } }
for( int t = 0; t <= 30; ++ t ) { for( int u = 1; u <= n; ++ u ) { for( int v = 1; v <= n; ++ v ) { if( f[t][u][v] ) dis[u][v] = min( dis[u][v], 1ll ); } } }
for( int k = 1; k <= n; ++ k ) { for( int u = 1; u <= n; ++ u ) { for( int v = 1; v <= n; ++ v ) { dis[u][v] = min( dis[u][v], dis[u][k] + dis[k][v] ); } } }