每个边应该只会被bfs搜到1遍啊=/
#include<bits/stdc++.h>
using namespace std;
#define int long long
bool vis[114514];
int du[114514];//入度
struct s{
int v,p;
}e[2145141];
int h[114514],cnt,w1[114514],w2[114514],n,m,d[114514];//w2分之w1
int gcd(int a,int b)
{
if(b>a) swap(a,b);
if(a==0||b==0) return 1;
if(a%b==0) return b;
return gcd(b,a%b);
}
void Add(int u,int v)
{
e[++cnt].v=v;
e[cnt].p=h[u],h[u]=cnt;
}
queue<int> q;
void bfs()
{
while(!q.empty())
{
int u=q.front();
q.pop();
if(d[u]==0) continue;
int z1=w1[u],z2=w2[u]*d[u];
int te=gcd(z1,z2);
z1/=te,z2/=te;
for(int i=h[u];i;i=e[i].p)
{
int v=e[i].v;
if(--du[v]==0) q.push(v);
w1[v]=z1*w2[v]+w1[v]*z2;
w2[v]=w2[v]*z2;
te=gcd(w1[v],w2[v]);
w1[v]/=te,w2[v]/=te;
}
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
cin>>d[i];
if(d[i]==0)
{
vis[i]=1;
}
for(int j=1;j<=d[i];j++)
{
cin>>x;
du[x]++;
Add(i,x);
}
}
for(int i=1;i<=n;i++)
{
w2[i]=1;
if(!du[i])
{
w1[i]=1;
q.push(i);
}
}
bfs();
for(int i=1;i<=n;i++)
{
if(vis[i])
{
cout<<w1[i]<<" "<<w2[i]<<endl;
}
}
}