RT
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define int long long
using namespace std;
inline int read(){
register int x=0,v=1,ch=getchar();
while(!isdigit(ch)){if(ch=='-')v=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^'0');ch=getchar();};
return x*v;
}
const int MAX=1e5+5;
struct E{
int e,next;
}e[MAX];
int cnt=1,head[MAX];
inline void add(int u,int v){
e[cnt]=(E){v,head[u]};head[u]=cnt++;
}
int n,m,d[MAX],de[MAX];
int ansp[MAX],ansq[MAX];
int u[MAX],v[MAX];
int gcdd(int a,int b){
return b?gcdd(b,a%b):a;
}
queue<int>q;
int s[MAX];
inline void topsort(){
for(register int i=1;i<=n;++i)ansp[i]=0,ansq[i]=1;
for(register int i=1;i<=n;++i)if(!de[i])q.push(i),ansp[i]=1;
while(!q.empty()){
int x=q.front();q.pop();
s[++s[0]]=x;
for(register int i=head[x];i;i=e[i].next){
--de[e[i].e];
if(de[e[i].e]==0)q.push(e[i].e);
}
}
}
signed main(){
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
n=read(),m=read();
for(register int i=1;i<=n;++i){
d[i]=read();
for(register int j=1;j<=d[i];++j){
int u=read();
add(i,u);
++de[u];
}
}
topsort();
for(register int u=1,p,q;u<=n;++u){
int x=s[u];
p=ansp[x];
q=ansq[x]*d[x];
int g=gcdd(p,q);
p/=g,q/=g;
for(register int i=head[x],P,Q,g;i;i=e[i].next){
P=ansp[e[i].e]*q+ansq[e[i].e]*p;
Q=ansq[e[i].e]*q;
g=gcdd(P,Q);
P/=g,Q/=g;
ansp[e[i].e]=P;
ansq[e[i].e]=Q;
}
}
for(register int i=1;i<=n;++i){
if(!d[i])printf("%lld %lld\n",ansp[i],ansq[i]);
}
return 0;
}