#include <bits/stdc++.h>
#define ll __int128
using namespace std;
const int N = 1e5 + 5;
int n, m, d[N], es[N][6];
int q[N], deg[N];
ll gcd(ll a, ll b) {
if (a == 0)
return b;
if (b == 0)
return a;
return gcd(b, a % b);
}
struct node {
ll a, b;
inline node operator + (const node &aa) {
ll val = gcd(b, aa.b);
val = (b / val) * aa.b;
return (node) {
val / b *a + val / aa.b *aa.a, val
};
}
inline void calc() {
ll val = gcd(a, b);
a /= val, b /= val;
}
} dp[N];
inline void ffr(int &ret) {
ret = 0;
register int ch = getchar();
while (!isdigit(ch))
ch = getchar();
while (isdigit(ch))
ret = ret * 10 + (ch ^ 48), ch = getchar();
}
void ks(ll val) {
int st[30], top = 0;
if (val == 0) {
putchar(48);
return;
}
while (val)
st[++top] = val % 10, val /= 10;
for (register int i = top; i >= 1; --i)
putchar(st[i] ^ 48);
}
int main() {
ffr(n), ffr(m);
for (register int i = 1; i <= n; ++i) {
ffr(d[i]), dp[i] = (node) {
0, 1
};
for (register int j = 1; j <= d[i]; ++j)
ffr(es[i][j]), ++deg[es[i][j]];
}
register int l = 1, r = 0;
for (register int i = 1; i <= m; ++i)
q[++r] = i, dp[i] = (node) {
1, 1
};
while (l <= r) {
int u = q[l++];
node tmp = dp[u];
ll gg = gcd(tmp.a, d[u]);
int val = d[u];
tmp.a /= gg, val /= gg, tmp.b *= val;
for (register int i = 1; i <= d[u]; ++i) {
int v = es[u][i];
dp[v] = dp[v] + tmp;
if ((--deg[v]) == 0)
q[++r] = v;
}
}
for (register int i = 1; i <= n; ++i)
if (d[i] == 0) {
dp[i].calc();
ks(dp[i].a);
putchar(' ');
ks(dp[i].b);
putchar('\n');
}
return 0;
}