#include <cstdio> #include <algorithm> #include <vector> #define X first #define Y second #define mp make_pair #define pb push_back using namespace std; typedef pair< int, int > pii; int N, cnt = 0; vector< vector< int > > G; vector< int > low, time, visited; vector< pii > bridges; void dfs( int u, int p ) { time[ u ] = ++cnt; low[ u ] = time[ u ]; for( int i = 0; i < G[ u ].size(); i++ ) { int v = G[ u ][ i ]; if( v == p ) continue; if( !time[ v ] ) { dfs( v, u ); if( time[ u ] < low[ v ] ) bridges.pb( mp( min( u, v ), max( u, v ) ) ); low[ u ] = min( low[ u ], low[ v ] ); } else { low[ u ] = min( low[ u ], time[ v ] ); } } } int main( void ) { while( scanf("%d", &N ) == 1 ) { G.resize( N + 1 ); low.resize( N + 1, 0 ); time.resize( N + 1, 0 ); for( int i = 0; i < N; i++ ) { int u, e, v; scanf("%d (%d)", &u, &e ); for( int j = 0; j < e; j++ ) { scanf("%d", &v ); G[ u ].pb( v ); } } for( int i = 0; i < N; i++ ) { if( !time[ i ] ) dfs( i, -1 ); } sort( bridges.begin(), bridges.end() ); printf("%d critical links\n", bridges.size() ); for( int i = 0; i < bridges.size(); i++ ) { printf("%d - %d\n", bridges[ i ].X, bridges[ i ].Y ); } printf("\n"); cnt = 1; bridges.clear(); for( int i = 0; i < N; i++ ) G[ i ].clear(); low.clear(); time.clear(); } return 0; }