#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;
}
#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;
}