description: A subarray of array a from index l to the index r is the array [a_l, a_{l+1}, ..., a_{r}]. The number of occurrences of the array b in the array a is the number of subarrays of a such that they are equal to b.
  
  You are given n arrays A_1, A_2, ..., A_n; the elements of these arrays are integers from 1 to k. You have to build an array a consisting of m integers from 1 to k in such a way that, for every given subarray A_i, the number of occurrences of A_i in the array a is not less than the number of occurrences of each non-empty subarray of A_i in a. Note that if A_i doesn't occur in a, and no subarray of A_i occurs in a, this condition is still met for A_i.
  
  Your task is to calculate the number of different arrays a you can build, and print it modulo 998244353.
  
  Input
  
  The first line contains three integers n, m and k (1 ≤ n, m, k ≤ 3 ⋅ 10^5) — the number of the given arrays, the desired length of the array a, and the upper bound on the values in the arrays.
  
  Then n lines follow. The i-th line represents the array A_i. The first integer in the i-th line is c_i (1 ≤ c_i ≤ m) — the number of elements in A_i; then, c_i integers from 1 to k follow — the elements of the array A_i.
  
  Additional constraint on the input: ∑_{i=1}^n c_i ≤ 3 ⋅ 10^5; i. e., the number of elements in the given arrays in total does not exceed 3 ⋅ 10^5.
  
  Output
  
  Print one integer — the number of different arrays a you can build, taken modulo 998244353.
  
  Examples
  
  Input
  
  
  2 4 3
  2 1 2
  1 3
  
  
  Output
  
  
  5
  
  
  Input
  
  
  2 4 3
  2 1 2
  3 3 2 1
  
  
  Output
  
  
  0
  
  
  Input
  
  
  1 42 1337
  2 13 31
  
  
  Output
  
  
  721234447
solution: #include <bits/stdc++.h>
  using namespace std;
  const double PI = acos(-1);
  const long long nax = 2e5 + 10, mod = 998244353, inf = 1e18;
  long long mul(long long x, long long y) { return x * y % mod; }
  void solve() {
    long long n, m, k;
    cin >> n >> m >> k;
    vector<vector<long long>> g(k), ad(k);
    for (long long i = 0; i < n; i++) {
      long long x;
      cin >> x;
      long long d;
      cin >> d;
      --d;
      for (long long j = 1; j < x; j++) {
        long long y;
        cin >> y;
        --y;
        g[d].push_back(y);
        ad[y].push_back(d);
        d = y;
      }
    }
    for (long long i = 0; i < k; i++) {
      sort(g[i].begin(), g[i].end());
      g[i].resize(unique(g[i].begin(), g[i].end()) - g[i].begin());
      sort(ad[i].begin(), ad[i].end());
      ad[i].resize(unique(ad[i].begin(), ad[i].end()) - ad[i].begin());
    }
    map<long long, long long> vis;
    vector<bool> used(k, 0), mark(k, 0);
    for (long long i = 0; i < k; i++) {
      if (mark[i]) continue;
      vector<long long> qq(1, i);
      mark[i] = 1;
      for (long long j = 0; j < qq.size(); j++) {
        for (auto it : g[qq[j]])
          if (!mark[it]) {
            qq.push_back(it);
            mark[it] = 1;
          }
        for (auto it : ad[qq[j]])
          if (!mark[it]) {
            qq.push_back(it);
            mark[it] = 1;
          }
      }
      long long val = 0;
      for (auto xx : qq) val += g[xx].size();
      if (val != qq.size() - 1) continue;
      long long e = -1;
      for (auto ii : qq)
        if (ad[ii].empty()) {
          e = ii;
          break;
        }
      vector<long long> seq(1, e);
      used[e] = 1;
      while (1) {
        long long nxt = -1;
        for (auto ii : g[seq.back()])
          if (!used[ii]) {
            nxt = ii;
            break;
          }
        if (nxt == -1) break;
        seq.push_back(nxt);
        used[nxt] = 1;
      }
      if (seq.size() == qq.size()) vis[seq.size()]++;
    }
    vector<pair<long long, long long>> et;
    for (auto it : vis) et.push_back(it);
    vector<long long> dp(m + 1);
    dp[0] = 1;
    for (long long i = 1; i < m + 1; i++) {
      for (auto it : et)
        if (i >= it.first) {
          dp[i] += mul(dp[i - it.first], it.second);
          dp[i] %= mod;
        }
    }
    cout << dp[m] << endl;
  }
  int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    long long tt = 1;
    for (long long i = 1; i <= tt; i++) {
      solve();
    }
    return 0;
  }
  