#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const long long mo=10007;
const int N=1005;
using namespace std;
long long son[N][2],size[N],f[N],jc[N*3],ny[N*3],n,m,T;
long long mi(long long x,long long y)
{long long sum=1;while(y) {if(y&1) sum=sum*x%mo;x=x*x%mo;y>>=1;}return sum;
}
long long C(long long mm,long long nn)
{if(nn>mm) swap(nn,mm);return jc[mm]*ny[nn]%mo*ny[mm-nn];
}
void dg(int x)
{size[x]=1;int j=son[x][0],k=son[x][1];if(j) dg(j);if(k) dg(k);int s1=size[j],s2=size[k];size[x]+=s1+s2;if(j && k) f[x]=f[j]%mo*f[k]%mo*C(s1+s2,min(s1,s2))%mo;elseif(j) f[x]=f[j];else f[x]=1;
}
int main()
{jc[0]=ny[0]=1;for(int i=1;i<=3000;i++){jc[i]=jc[i-1]*i%mo;ny[i]=mi(jc[i],mo-2);}scanf("%lld",&T);for(;T--;){memset(son,0,sizeof(son));memset(size,0,sizeof(size));memset(f,0,sizeof(f));f[0]=1;scanf("%lld",&n);for(int i=1;i<=n;i++){int last=i,x,k;scanf("%d",&k);for(int i=1;i<=k;i++){scanf("%d",&x);if(!son[last][0]) son[last][0]=x;else son[last][1]=x;last=x;}}dg(1);printf("%lld\n",f[1]);}
}