// Author:Arturia #include #include #include #include #include #include #include #include #include #include #include #include #include #define For(i,x,y) for (int i=x,_=y;i<_;i++) #define Rep(i,x,y) for (int i=x,_=y;i<=_;i++) #define cross(x,a) for (int x=hd[a];~x;x=nx[x]) #define ll long long #define PII pair #define PDD pair #define mk(a,b) make_pair(a,b) #define fs first #define sc second #define pb push_back #define VI vector #define VS vector #define MC(a,b) memcpy(a,b,sizeof b) #define MS(a,b) memset(a,b,sizeof a) using namespace std; inline ll rd(){ ll x=0;int ch=getchar(),f=1; while (!isdigit(ch)&&(ch!='-')&&(ch!=EOF)) ch=getchar(); if (ch=='-'){f=-1;ch=getchar();} while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*f; } inline void rt(ll x){ if (x<0) putchar('-'),x=-x; if (x>=10) rt(x/10),putchar(x%10+'0'); else putchar(x+'0'); } const int p=1e9+7; int Pow(int a,int b){ int res=1; for (;b;b>>=1,a=1ll*a*a%p) if (b&1) res=1ll*res*a%p; return res; } const int N=50+3; int A[N][N]; void Gauss(int n){ Rep(i,1,n){ if (!A[i][i]){ int r=i; Rep(j,i+1,n) if (A[j][i]) r=j; Rep(j,i,n+1) swap(A[i][j],A[r][j]); } int x=Pow(A[i][i],p-2); Rep(j,i,n+1){ A[i][j]=1ll*A[i][j]*x%p; } Rep(j,1,n) if (i!=j&&A[j][i]){ int x=p-A[j][i]; Rep(k,i,n+1) A[j][k]=(A[j][k]+1ll*x*A[i][k])%p; } } } int f[N*N][N],g[N][N*N],w[N*N],b[N][N*N],c[N][N*N]; int com[N*N][N*N]; int h[N*N]; int all[N*N]; int pro[N]; VI V[N]; int n,num,Ans,tmp,prob; const ll inf=8e18; void dp(){ For(i,0,N*N){ com[i][0]=1; For(j,1,i+1) com[i][j]=(com[i-1][j-1]+com[i-1][j])%p; } b[0][0]=1; For(i,1,n+1) For(j,0,i*(i-1)/2+1) For(k,1,i+1) if (k*(k-1)/2<=j){ b[i][j]=(b[i][j]-1ll*com[i][k]*b[i-k][j-k*(k-1)/2]%p+p)%p; } For(i,1,n+1) For(j,0,i*(i-1)/2+1) For(k,1,i+1) if (k*(k-1)/2<=j){ c[i][j]=(c[i][j]+1ll*com[i-1][k-1]*b[i-k][j-k*(k-1)/2])%p; } For(i,1,n+1) For(j,0,i*(i-1)/2+1){ ll val=0; For(k,j,i*(i-1)/2+1){ val+=1ll*com[k][j]*c[i][k]; if (val>inf) val%=p; } g[i][j]=val%p; } For(t,0,n*(n-1)/2+1){ all[t]=com[n*(n-1)/2][t]; For(i,1,n){ int tmp=1ll*com[n-1][i-1]*i%p*(n-i)%p; ll val=0; For(j,0,i*(i-1)/2+1) if (j<=t-1){ val+=1ll*tmp*g[i][j]%p*g[n-i][t-1-j]; if (val>inf) val%=p; } w[t]=(w[t]+val)%p; } } } void Init(){ memset(A,0,sizeof(A)); memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); memset(w,0,sizeof(w)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); memset(com,0,sizeof(com)); memset(h,0,sizeof(h)); memset(all,0,sizeof(all)); memset(pro,0,sizeof(pro)); For(i,0,N) V[i].clear(); n=num=Ans=tmp=prob=0; } int main(){ for (int T=rd();T--;){ Init(); n=rd(); For(i,1,n+1) pro[i]=rd(); For(i,1,n+1){ for (int x=rd();x--;) V[i].pb(rd()); } dp(); for (int t=n*(n-1)/2-1;~t;t--) if (g[n][t]!=all[t]){ memset(A,0,sizeof(A)); For(i,1,n+1){ A[i][i]=A[i][n+1]=1; } prob=1ll*(all[t]-g[n][t]+p)*(n*(n-1)/2-t)%p; prob=1ll*w[t+1]*Pow(prob,p-2)%p; For(i,1,n+1){ A[i][n+1]=(A[i][n+1]+1ll*pro[i]*prob%p*(p-1))%p; tmp=1ll*pro[i]*(1-prob+p)%p*Pow(V[i].size(),p-2)%p; For(j,0,V[i].size()){ int x=V[i][j]; A[i][n+1]=(A[i][n+1]+1ll*tmp*f[t+1][x])%p; } tmp=1ll*(1-pro[i]+p)*Pow(V[i].size(),p-2)%p; For(j,0,V[i].size()){ int x=V[i][j]; A[i][x]=(A[i][x]-tmp+p)%p; } } Gauss(n); For(i,1,n+1){ f[t][i]=A[i][n+1]; } } else{ For(i,1,n+1){ f[t][i]=p-1; } } printf("%d\n",f[0][1]); } }