#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#define N 100005
#define ull unsigned long long
using namespace std;
int n,m,head[N],w[N],num,d[N],f[15],ff;
bool vis[N];
struct way{
int nx,de;
}q[N*5];
struct spot{
ull fz,fm;
}z[N];
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
void establish(int st,int ed){
num++;
q[num].nx=head[st]; head[st]=num; q[num].de=ed;
}
void loading(){
memset(head,-1,sizeof(head));
n=read(); m=read(); int x;
for(int i=1;i<=n;i++){
w[i]=read();
if(!w[i]){ ff++; f[ff]=i; continue; }
for(int j=1;j<=w[i];j++){
x=read(); establish(i,x); d[x]++;
}
}
}
int maxgys(int x,int y){
ull o=max(x,y),k=min(x,y);
ull r=o%k;
while(r>0){
o=k; k=r; r=o%k;
}
return k;
}
void yf(int x){
ull t=maxgys(z[x].fz,z[x].fm);
if(t==1) return;
z[x].fz/=t; z[x].fm/=t;
}
void add(int a,int b){
ull s=z[b].fm*w[b];
if(z[a].fz==0){z[a].fz=z[b].fz; z[a].fm=s;}
else{
ull t=maxgys(z[a].fm,s);
z[a].fz=z[a].fz*(s/t)+z[b].fz*(z[a].fm/t);
z[a].fm=s/t*z[a].fm;
}
yf(a);
}
void pwater(int x){
queue <int> p; vis[x]=1;
for(int i=head[x];i>0;i=q[i].nx){
add(q[i].de,x); d[q[i].de]--; vis[q[i].de]=1;
p.push(q[i].de);
}
while(!p.empty()){
int s=p.front(); p.pop();
if(d[s]){p.push(s); continue;}
for(int i=head[s];i>0;i=q[i].nx){
add(q[i].de,s); d[q[i].de]--;
if(!vis[q[i].de]){p.push(q[i].de);vis[q[i].de]=1;}
}
}
}
void out(){
for(int i=1;i<=ff;i++) printf("%d %d\n",z[f[i]].fz,z[f[i]].fm);
}
void solve(){
queue<int> p;
for(int i=1;i<=n;i++)
if(!d[i]) p.push(i);
while(!p.empty()){
int t=p.front(); p.pop();
z[t].fz=z[t].fm=1;
memset(vis,0,sizeof(vis));
pwater(t);
}
}
int main(){
loading();
solve();
out();
return 0;
}