rt.
#include <bits/stdc++.h>
using namespace std;
const long long N = 100005;
long long n , m , d[N] , rd[N];
vector <long long> g[N] , lst;
queue <long long> q;
struct num
{
long long fz , fm;
};
num cnt[N];
long long gcd(long long x , long long y)
{
if(!y)
{
return x;
}
return gcd(y , x % y);
}
void add(long long now , long long FZ , long long FM)
{
long long GCD = gcd(FZ , FM);
FZ /= GCD;
FM /= GCD;
GCD = gcd(FM , cnt[now].fm);
FZ *= cnt[now].fm / GCD;
FM *= cnt[now].fm / GCD;
cnt[now].fz *= FM / cnt[now].fm;
cnt[now].fz += FZ;
cnt[now].fm = FM;
GCD = gcd(cnt[now].fz , cnt[now].fm);
cnt[now].fz /= GCD;
cnt[now].fm /= GCD;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for(long long i = 1 ; i <= n ; i++)
{
cin >> d[i];
cnt[i].fm = 1;
cnt[i].fz = (i <= m);
for(long long j = 1 ; j <= d[i] ; j++)
{
long long x;
cin >> x;
g[i].push_back(x);
rd[x]++;
}
if(!d[i])
{
lst.push_back(i);
}
}
for(long long i = 1 ; i <= n ; i++)
{
if(rd[i] == 0)
{
q.push(i);
}
}
while(!q.empty())
{
long long u = q.front();
q.pop();
if(!cnt[u].fz)
{
continue;
}
for(auto v : g[u])
{
add(v , cnt[u].fz , cnt[u].fm * d[u]);
rd[v]--;
if(rd[v] == 0)
{
q.push(v);
}
}
}
for(auto u : lst)
{
cout << cnt[u].fz << " " << cnt[u].fm << endl;
}
return 0;
}