#include <bits/stdc++.h>
using namespace std;
#define int __int128
long long n,m;
int d[100005],x,fa[100005],vis[100005],fm[100005],fz[100005];
vector<int> v[100005];
long long read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void write(int x){
if(x>9){
write(x/10);
}
putchar(x%10|48);
}
int gcd(int x,int y)
{
if(y==0)
return x;
return gcd(y,x%y);
}
void expand(int u, int p)
{
int x=fz[u];
int y=fm[u]*v[u].size();
if(y==0) return;
if(fm[p]==0)
{
fm[p]=y;
fz[p]=x;
return;
}
int p1=fz[p]*y+x*fm[p];
int p2=fm[p]*y;
int p3=gcd(p1,p2);
fz[p]=p1/p3;
fm[p]=p2/p3;
}
queue<int> q;
void bfs()
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
if(!fa[i])
{
vis[i]=1;
q.push(i);
fm[i]=1,fz[i]=1;
}
}
while(!q.empty())
{
int k=q.front();
q.pop();
if(d[k]==0) continue;
for(int i=0;i<v[k].size();i++)
{
expand(k,v[k][i]);
if(vis[v[k][i]]) continue;
fa[v[k][i]]--;
if(fa[v[k][i]]==0)
{
vis[v[k][i]]=1;
q.push(v[k][i]);
}
}
}
}
signed main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
{
d[i]=read();
for(int j=1;j<=d[i];j++)
{
x=read();
v[i].push_back(x);
fa[x]++;
}
}
bfs();
for(int i=1;i<=n;i++)
{
if(d[i]==0)
{
write(fz[i]);
cout << " ";
write(fm[i]);
cout << endl;
}
}
return 0;
}