//Bridges in a Graphs
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<utility>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define MAX 205
int parent[MAX],timer=0,low[MAX],disc[MAX];
bool vis[MAX];
vector<pair<int,int> >st;
vector<vector<int> >G(MAX);
bool cmp(const pair<int,int> a,pair<int,int> b)
{
	if(a.first==a.second)
	return a.second<b.second;
	else
	return a.first<b.first;
}
void reset()
{
	st.clear();
	memset(parent,-1,sizeof parent);
	memset(vis,false,sizeof vis);
	for(int i=0;i<=MAX;i++)
	G[i].clear();
}
void dfs(int u)
{	
	vis[u]=true;
	disc[u]=low[u]=timer++;
	for(int i=0;i<G[u].size();i++)
	{
		int v=G[u][i];
		if(!vis[v])
		{
			parent[v]=u;
			dfs(v);
			low[u]=min(low[u],low[v]);
			if(low[v]>low[u])
			st.push_back(make_pair(min(u,v),max(u,v)));
		}
		else if(v!=parent[u])
			low[u]=min(low[u],disc[v]);
	}
}
int main()
{
	int n,t=0;
	
	while(cin>>n)
	{
		reset();
		if(t>0)
		cout<<endl;
		if(n==0)
		{
			cout<<"0"<<" critical links\n";break;
		}
		int node,count;
		
		for(int j=0;j<n;j++)
		{
			scanf("%d (%d)",&node,&count);
			for(int i=0;i<count;i++)
			{
				int x;
				scanf("%d",&x);
				G[node].push_back(x);
				G[x].push_back(node);
			}
		}
		for(int i=0;i<n;i++)
		{
			if(!vis[i])
			dfs(i);
		}
		sort(st.begin(),st.end(),cmp);
		cout<<st.size()<<" critical links\n";
		
		for(int i=0;i<st.size();i++)
		cout<<st[i].first<<" - "<<st[i].second<<endl;
		t++;
		
	}
}