#include using namespace std; #ifdef _RUTHEN #include #else #define show(...) true #endif using ll = long long; #define rep(i, n) for (int i = 0; i < (n); i++) template using V = vector; #include #include using mint = atcoder::modint998244353; int main() { ios::sync_with_stdio(false); cin.tie(0); int N, M; cin >> N >> M; atcoder::dsu uf(N); rep(i, M) { int L; cin >> L; V A(L); rep(j, L) { cin >> A[j]; A[j]--; } V S(N); rep(j, L) S[A[j]] = 1; V T; rep(j, N) if (S[j] == 0) T.push_back(j); rep(j, L - 1) uf.merge(A[j], A[j + 1]); int K = T.size(); rep(j, K - 1) uf.merge(T[j], T[j + 1]); } mint ans = 0; rep(i, N) if (uf.leader(i) == i) ans += mint(2).pow(uf.size(i)); cout << ans.val() << '\n'; return 0; }