#include <bits/stdc++.h> using namespace std; const long long MOD = 998244353; int main(void){ //cin.tie(nullptr); //ios::sync_with_stdio(false); long long N,K; cin >> N >> K; vector<vector<pair<long long,long long>>> E(K); for(int k=0;k<K;k++){ long long t; cin >> t; E[k].resize(t); for(int i=0;i<t;i++){ long long a,b; cin >> a >> b; a--;b--; if(a>b)swap(a,b); E[k][i] = {a,b}; } } //B[i][j] := k-iの橋をj社に発注できるようなk(<i)の数 long long B[1000][10]={}; for(int j=0;j<K;j++){ for(int i=0;i<(int)E[j].size();i++){ B[E[j][i].second][j]++; } } //dp[i][S] := 0番~i番までの街が連結になり、発注した建設会社の集合がSのときの発注の仕方の数 long long dp[1001][1024] = {}; dp[0][0] = 1; for(int i=0;i<N-1;i++){ for(int S=0;S<(1<<K);S++){ for(int j=0;j<K;j++){ dp[i+1][S|(1<<j)] += (B[i+1][j]*dp[i][S])%MOD; dp[i+1][S|(1<<j)] %= MOD; } } } long long Ans = dp[N-1][(1<<K)-1]; cout << Ans << endl; return 0; }