#include<bits/stdc++.h>
using namespace std;
struct node
{
int sum,fz,fm;
};
int n,m,fz[100005],fm[100005];
vector<int>v[100005];
void bfs(int rj)
{
queue<node>q;
q.push({rj,1,1});
while(q.size())
{
if(v[q.front().sum].size()==0)
{
if(fz[q.front().sum]==0)
{
fz[q.front().sum]=q.front().fz;
fm[q.front().sum]=q.front().fm;
}
else
{
int a=q.front().fm*fm[q.front().sum]/__gcd(q.front().fm,fm[q.front().sum]);
fz[q.front().sum]=a/fm[q.front().sum]*fz[q.front().sum]+q.front().fz*a/q.front().fm;
fm[q.front().sum]=a;
}
}
for(int i=0;i<v[q.front().sum].size();i++)
{
q.push({v[q.front().sum][i],1,v[q.front().sum].size()*q.front().fm});
}
q.pop();
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int j;
cin>>j;
while(j--)
{
int k;
cin>>k;
v[i].push_back(k);
}
}
for(int i=1;i<=m;i++)
{
bfs(i);
}
for(int i=1;i<=n;i++)
{
if(v[i].size()==0)cout<<fz[i]/__gcd(fz[i],fm[i])<<" "<<fm[i]/__gcd(fz[i],fm[i])<<"\n";
}
return 0;
}