#include<bits/stdc++.h>
using namespace std;
template<typename T>
inline void inr(T &x){
char c=getchar();bool f=0;
while (c<'0'||c>'9') {
if (c=='-') f=1;
c=getchar();
}
for (x=0;c>='0'&&c<='9';c=getchar())
x=(x<<3)+(x<<1)+(c&15);
x=f?-x:x;
}
template<typename T>
inline void outw(T x){
if(x<0) putchar('-'),x=-x;
if(x/10) outw(x/10);
putchar((x%10)|48);
}
struct number{
__int128 numerator,denominator;
};
__int128 gcd(__int128 x,__int128 y){
if(y==0) return x;
return gcd(y,x%y);
}
number jia(number x,number y){
number temp;
temp.denominator=x.denominator*y.denominator;
temp.numerator=x.numerator*y.denominator+y.numerator*x.denominator;
__int128 tgcd=gcd(temp.numerator,temp.denominator);
temp.numerator/=tgcd;
temp.denominator/=tgcd;
}
number chu(number x,int y){
number temp;
temp.denominator*=y;
__int128 tgcd=gcd(temp.numerator,temp.denominator);
temp.numerator/=tgcd;
temp.denominator/=tgcd;
}
const int N=1e5+5;
int n,m;
vector<int> ve[N];
int in[N],out[N];
number dis[N];
void top_sort(){
queue<int>q;
for(int i=1;i<=m;i++)
q.push(i),dis[i].numerator=dis[i].denominator=1;
for(int i=m+1;i<=n;i++)
dis[i].denominator=1;
while(!q.empty()){
int u=q.front();
q.pop();
int len=ve[u].size();
for(int v:ve[u]){
in[v]--;
dis[v]=jia(dis[v],chu(dis[u],len));
if(!in[v]) q.push(v);
}
}
}
int main(){
inr(n);inr(m);
for(int i=1;i<=n;i++){
int d;
inr(d);
out[i]=d;
for(int j=1;j<=d;j++){
int v;
inr(v);
ve[i].emplace_back(v);
in[v]++;
}
}
top_sort();
for(int i=1;i<=n;i++)
if(!out[i]){
outw(dis[i].numerator);
putchar(' ');
outw(dis[i].denominator);
putchar('\n');
}
return 0;
}