#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e6+7;
int n,m,a[N],ind[N],oud[N];
struct fenshu{
__int128 zi=0,mu=0;
fenshu(__int128 a=0,__int128 b=0){
zi=a;
mu=b;
}
};
vector<int> e[N];
fenshu ans[N];
int lcm(int x,int y){
return x*y/__gcd(x,y);
}
void add_edge(int i,int s){
e[i].push_back(s);
oud[i]++;
ind[s]++;
}
void push(fenshu &x){
if(x.zi==0) return;
__int128 f=__gcd(x.mu,x.zi);
fenshu r=fenshu((x.zi/f),(x.mu/f));
x=r;
}
fenshu tong(fenshu x,fenshu y){
if(x.zi==0&&y.zi==0) return fenshu();
if(x.zi==0||y.zi==0) return x.zi==0?y:x;
int cm=lcm(x.mu,y.mu);
int cz=cm/x.mu*x.zi+cm/y.mu*y.zi;
fenshu fin={cz,cm};
push(fin);
return fin;
}
void topo(){
queue<int> q;
for(int i=1;i<=m;i++){
ans[i]=fenshu(1,1);
q.push(i);
}
while(!q.empty()){
int u=q.front();
if(!oud[u]){
q.pop();
continue;
}
q.pop();
int len=e[u].size();
fenshu now=fenshu(ans[u].zi,len*ans[u].mu);
push(now);
ans[u]=fenshu(0,0);
for(int v:e[u]){
ans[v]=tong(ans[v],now);
ind[v]--;
if(!ind[v])
q.push(v);
}
}
}
void print(__int128 x){
if(x<0){
x=-x;
putchar('-');
}
if(x>9) print(x/10);
putchar(x%10+'0');
}
signed main(){
for(int i=1;i<=n;i++) ans[i]=fenshu();
cin>>n>>m;
for(int i=1,d;i<=n;i++){
cin>>d;
for(int j=1,s;j<=d;j++){
cin>>s;
add_edge(i,s);
}
}
topo();
for(int i=1;i<=n;i++){
if(!oud[i]){
push(ans[i]);
print(ans[i].zi);
cout<<' ';
print(ans[i].mu);
cout<<'\n';
}
}
return 0;
}