#include <bits/stdc++.h>   using namespace std;   double safe_sqrt(double x) { return sqrt(max((double)0.0, x)); }   long long GI(long long& x) { return scanf( %lld , &x); }   const long long MOD = 1e9 + 7;   const long long MN = 1000111;   long long gt[MN];   vector<long long> h[MN];   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     cout << (fixed) << setprecision(9);     const long long MOD = 1e9 + 7;     gt[0] = 1;     for (long long i = (1), _b = (MN - 1); i <= _b; ++i)       gt[i] = gt[i - 1] * i % MOD;     long long n, m;     while (GI(n) == 1 && GI(m) == 1) {       for (long long i = (1), _b = (m); i <= _b; ++i) h[i].clear();       for (long long i = (1), _b = (n); i <= _b; ++i) {         long long k;         GI(k);         while (k--) {           long long u;           GI(u);           h[u].push_back(i);         }       }       sort(h + 1, h + m + 1);       long long i = 1;       long long res = 1;       while (i <= m) {         long long j = i;         while (j < m && h[j + 1] == h[i]) j++;         res = res * gt[j - i + 1] % MOD;         i = j + 1;       }       cout << res << endl;     }   }   