#include<stdio.h> #include<stdlib.h> #define m 1000000007u typedef long long unsigned llu; typedef unsigned u; int C(const void*x,const void*y){return*(u*)x-*(u*)y;} int D(const void*x,const void*y) { if(*(llu*)x>*(llu*)y)return 1; if(*(llu*)x<*(llu*)y)return-1; return 0; } llu H[1111111],P[1111111]; u F[1111111],Q[1111111]; int main() { u t,q,n,i,j,r=1; for(F[i=0]=1;++i<1111111;)F[i]=i*(llu)F[i-1]%m; for(P[i=0]=1;++i<1111111;)P[i]=m*P[i-1]+1; for(scanf("%u%u",&t,&n);t--;) { scanf("%u",&q); for(i=-1;++i<q;)scanf("%u",Q+i); qsort(Q,q,sizeof(u),C);Q[q]=-1u; for(j=i=0;++i<=q;)if(Q[i]!=Q[j]) { H[Q[j]-1]+=(i-j)*P[t]; j=i; } } qsort(H,n,sizeof(llu),D);H[n]=-1llu; for(j=i=0;++i<=n;)if(H[i]!=H[j]) { r=r*(llu)F[i-j]%m; j=i; } printf("%u\n",r); return 0; }