#include <cstdio>
#include <cstring>
using namespace std;
const int N = 20, M = 1 << N;
int n, m;
int G[N + 5][N + 5];
int dp[M + 5];
int dps(int state, int p)
{
int &ans = dp[state];
if(ans >= 0) return ans;
if(p >= n) return ans = 1;
ans = 0;
for(int i = 0; i < m; i++)
{
if(G[p][i] && (state >> i & 1) == 0)
{
ans += dps(state | (1 << i), p + 1);
}
}
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
memset(dp, -1, sizeof(dp));
for(int i = 0; i < n; i++)
{
int t;
scanf("%d", &t);
while(t--)
{
int j;
scanf("%d", &j);
G[i][j - 1] = 1;
}
}
printf("%d\n", dps(0, 0));
return 0;
}