#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
#define int long long
int n,m;
struct node{
int fz,fm;
}w[maxn];
int sum=0;
int size[maxn];
int qwq[maxn];
int head[maxn];
int rd[maxn];
queue<int> q;
struct e{
int u,v;
int nxt;
}edge[maxn];
int tot;
void add(int u,int v){
edge[++tot].u=u;
edge[tot].v=v;
edge[tot].nxt=head[u];
head[u]=tot;
}
int gcd(int a,int b){
if(b==0)return a;
else
return gcd(b,a%b);
}
void yf(int x){
int tmp=gcd(w[x].fz,w[x].fm);
w[x].fz=w[x].fz/tmp;
w[x].fm=w[x].fm/tmp;
}
void add_shu(int a,int b){
int tmp=gcd(w[a].fm,w[b].fm);
int lcm=w[a].fm*w[b].fm/tmp;
w[a].fz=w[a].fz*(lcm/w[a].fm);
w[b].fz=w[b].fz*(lcm/w[b].fm);
w[b].fz=w[a].fz+w[b].fz;
w[a].fm=lcm;
w[b].fm=lcm;
yf(b);
}
void bfs(){
while(!q.empty()){
int u=q.front();
q.pop();
if(size[u])w[u].fm=w[u].fm*size[u];
if(w[u].fz)yf(u);
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v;
rd[v]--;
add_shu(u,v);
if(rd[v]==0)
q.push(v);
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{
w[i].fm=1,w[i].fz=0;
int cnt;
cin>>cnt;
size[i]=cnt;
if(size[i]==0)qwq[++sum]=1;
for(int j=1;j<=cnt;j++){
int k;
cin>>k;
add(i,k);
rd[k]++;
}
}
for(int i=1;i<=n;i++)
{
if(rd[i]==0)
{
w[i].fz=w[i].fm=1;
q.push(i);
}
}
bfs();
for(int i=1;i<=sum;i++)
{
yf(qwq[i]);
cout<<w[qwq[i]].fz<<" "<<w[qwq[i]].fm<<endl;
}
return 0;
}