#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void solve( vector< vector< int >> & graph,vector< int > & dp,vector< int > & indegrees,vector< int > & outdegrees) {
queue< int > q;
int n= graph.size ( ) ;
for ( int i= 0 ; i< n; i++ ) {
if ( indegrees[ i] == 0 ) {
q.push ( i) ;
}
}
while ( ! q.empty ( ) ) {
int node= q.front ( ) ;
q.pop ( ) ;
for ( auto & child: graph[ node] ) {
dp[ child] = max( dp[ child] ,dp[ node] + 1 ) ;
indegrees[ child] -- ;
if ( indegrees[ child] == 0 ) q.push ( child) ;
}
outdegrees[ node] = 0 ;
}
}
int main( ) {
int n;
cin >> n;
vector< vector< int >> graph( n) ;
vector< vector< int >> rev_graph( n) ;
int m;
cin >> m;
int i= 0 ;
vector< int > indegrees( n,0 ) ;
vector< int > outdegrees( n,0 ) ;
vector< int > ins( n,0 ) ;
vector< int > outs( n,0 ) ;
while ( i< m) {
int x,y;
cin >> x>> y;
graph[ x] .push_back ( y) ;
rev_graph[ y] .push_back ( x) ;
outdegrees[ x] ++ ;
indegrees[ y] ++ ;
ins[ x] ++ ;
outs[ y] ++ ;
i++ ;
}
vector< int > dp( n,0 ) ;
vector< int > rev_dp( n,0 ) ;
solve( graph,dp,indegrees,outdegrees) ;
solve( rev_graph,rev_dp,ins,outs) ;
for ( int i= 0 ; i< n; i++ ) {
cout << "Node: " << i<< ": longest path including this node: " << dp[ i] + rev_dp[ i] + 1 << endl;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgp2b2lkIHNvbHZlKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mZ3JhcGgsdmVjdG9yPGludD4mZHAsdmVjdG9yPGludD4maW5kZWdyZWVzLHZlY3RvcjxpbnQ+Jm91dGRlZ3JlZXMpewogICAgcXVldWU8aW50PnE7CiAgICBpbnQgbj1ncmFwaC5zaXplKCk7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKXsKICAgICAgICBpZihpbmRlZ3JlZXNbaV09PTApewogICAgICAgICAgICBxLnB1c2goaSk7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlKCFxLmVtcHR5KCkpewogICAgICAgIGludCBub2RlPXEuZnJvbnQoKTsKICAgICAgICBxLnBvcCgpOwoKICAgICAgICBmb3IoYXV0byZjaGlsZDpncmFwaFtub2RlXSl7CiAgICAgICAgICAgIGRwW2NoaWxkXT1tYXgoZHBbY2hpbGRdLGRwW25vZGVdKzEpOwogICAgICAgICAgICBpbmRlZ3JlZXNbY2hpbGRdLS07CiAgICAgICAgICAgIGlmKGluZGVncmVlc1tjaGlsZF09PTApIHEucHVzaChjaGlsZCk7CiAgICAgICAgfQogICAgICAgIG91dGRlZ3JlZXNbbm9kZV09MDsKICAgIH0KCn0KCmludCBtYWluKCl7CiAgICBpbnQgbjsKICAgIGNpbj4+bjsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj5ncmFwaChuKTsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj5yZXZfZ3JhcGgobik7CiAgICBpbnQgbTsKICAgIGNpbj4+bTsKICAgIGludCBpPTA7CiAgICB2ZWN0b3I8aW50PmluZGVncmVlcyhuLDApOwogICAgdmVjdG9yPGludD5vdXRkZWdyZWVzKG4sMCk7CiAgICB2ZWN0b3I8aW50PmlucyhuLDApOwogICAgdmVjdG9yPGludD5vdXRzKG4sMCk7CgogICAgd2hpbGUoaTxtKXsKICAgICAgICBpbnQgeCx5OwogICAgICAgIGNpbj4+eD4+eTsKICAgICAgICBncmFwaFt4XS5wdXNoX2JhY2soeSk7CiAgICAgICAgcmV2X2dyYXBoW3ldLnB1c2hfYmFjayh4KTsKICAgICAgICBvdXRkZWdyZWVzW3hdKys7CiAgICAgICAgaW5kZWdyZWVzW3ldKys7CiAgICAgICAgaW5zW3hdKys7CiAgICAgICAgb3V0c1t5XSsrOwogICAgICAgIGkrKzsKICAgIH0KCiAgICB2ZWN0b3I8aW50PmRwKG4sMCk7CiAgICB2ZWN0b3I8aW50PnJldl9kcChuLDApOwoKICAgIHNvbHZlKGdyYXBoLGRwLGluZGVncmVlcyxvdXRkZWdyZWVzKTsKICAgIHNvbHZlKHJldl9ncmFwaCxyZXZfZHAsaW5zLG91dHMpOwoKICAgIGZvcihpbnQgaT0wO2k8bjtpKyspewogICAgICAgIGNvdXQ8PCJOb2RlOiAiPDxpPDwiOiBsb25nZXN0IHBhdGggaW5jbHVkaW5nIHRoaXMgbm9kZTogIjw8ZHBbaV0rcmV2X2RwW2ldKzE8PGVuZGw7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=