#include <bits/stdc++.h>   using namespace std;   const int M = 1000000007;   const int N = 100005, E = 262144;   int n, m, i, u, v, p, t, vis[55][55], j, k;   vector<int> g[55][55];   int q[N], l, r;   vector<int> ansr, ansl, w[55][55];   long long g1[55][55][105], g2[55][55][105], g3[55][55][105];   long long dp[105][55][2], f[55][55][105], ans[55][105], fe[55][55][105];   bool flag1 = true;   int main() {     scanf( %d %d , &n, &m);     for (i = 1; i <= m; ++i) {       scanf( %d %d , &u, &v);       vis[u][v] = 1;       scanf( %d , &t);       if (t == 0) flag1 = false;       while (t--) {         scanf( %d , &p);         g[u][v].push_back(p);       }     }     bool flag = true;     for (i = 1; i <= n; ++i)       for (j = 1; j <= n; ++j)         if (i != j) {           for (k = 0; k + 1 < g[i][j].size(); ++k)             if (g[i][j][k] == i && g[i][j][k + 1] == j) break;           if (k + 1 < g[i][j].size()) {             l = 1, r = 0;             for (p = k + 2; p < g[i][j].size(); ++p) q[++r] = g[i][j][p];             p = j;             ansl.clear(), ansr.clear();             ansr.push_back(j);             while (l <= r && r <= 2 * n) {               if (!vis[p][q[l]]) break;               for (auto it : g[p][q[l]]) q[++r] = it;               p = q[l];               ansr.push_back(q[l]);               ++l;             }             if (l <= r) continue;             l = 1, r = 0;             for (p = k - 1; p >= 0; --p) q[++r] = g[i][j][p];             p = i;             ansl.push_back(i);             while (l <= r && r <= 2 * n) {               if (!vis[q[l]][p]) break;               for (int i = g[q[l]][p].size() - 1; i >= 0; --i)                 q[++r] = g[q[l]][p][i];               p = q[l];               ansl.push_back(q[l]);               ++l;             }             if (l <= r) continue;             if (ansl.size() + ansr.size() <= 2 * n) {               ++g1[ansl[ansl.size() - 1]][ansr[ansr.size() - 1]]                   [ansl.size() + ansr.size() - 1];             }           }         }     for (i = 1; i <= n; ++i)       for (j = 1; j <= n; ++j)         if (g[i][j].size() && g[i][j][0] == j) {           l = 1, r = 0;           for (p = 1; p < g[i][j].size(); ++p) q[++r] = g[i][j][p];           p = j;           ansr.clear();           ansr.push_back(j);           while (l <= r && r <= 2 * n) {             if (!vis[p][q[l]]) break;             for (auto it : g[p][q[l]]) q[++r] = it;             p = q[l];             ansr.push_back(q[l]);             ++l;           }           if (l <= r) continue;           ++g3[i][ansr[ansr.size() - 1]][ansr.size()];         }     for (i = 1; i <= n; ++i)       for (j = 1; j <= n; ++j)         if (g[i][j].size() && g[i][j][g[i][j].size() - 1] == i) {           l = 1, r = 0;           for (p = g[i][j].size() - 2; p >= 0; --p) q[++r] = g[i][j][p];           p = i;           ansl.clear();           ansl.push_back(i);           while (l <= r && r <= 2 * n) {             if (!vis[q[l]][p]) break;             for (int i = g[q[l]][p].size() - 1; i >= 0; --i)               q[++r] = g[q[l]][p][i];             p = q[l];             ansl.push_back(q[l]);             ++l;           }           if (l <= r) continue;           ++g2[ansl[ansl.size() - 1]][j][ansl.size()];         }     for (i = 1; i <= n; ++i)       for (j = 1; j <= n; ++j)         for (k = 1; k <= 2 * n; ++k)           if (g1[i][j][k] || g2[i][j][k] || g3[i][j][k]) w[i][j].push_back(k);     for (i = 1; i <= n; ++i) {       memset(dp, 0, sizeof(dp));       dp[0][i][0] = 1;       for (j = 1; j <= n * 2; ++j)         for (k = 1; k <= n; ++k)           for (l = 1; l <= n; ++l)             for (auto m : w[l][k]) {               dp[j][k][0] = (dp[j][k][0] + dp[j - m][l][0] * g2[l][k][m]) % M;               dp[j][k][1] = (dp[j][k][1] + dp[j - m][l][0] * g1[l][k][m] +                              dp[j - m][l][1] * g3[l][k][m]) %                             M;             }       for (j = 1; j <= n; ++j)         for (k = 1; k <= 2 * n; ++k) f[i][j][k] = dp[k][j][1];     }     for (i = 1; i <= n; ++i)       for (j = 1; j <= n; ++j)         for (k = 1; k <= 2 * n; ++k) ans[j][k] = (ans[j][k] + f[i][j][k]) % M;     for (i = 1; i <= n; ++i)       for (j = 1; j <= n; ++j)         for (l = 1; l <= n; ++l)           if (g[l][i].size() == 0 && vis[l][i])             for (k = 1; k < 2 * n; ++k)               fe[l][j][k + 1] = (fe[l][j][k + 1] + f[i][j][k]) % M;     for (k = 1; k <= 2 * n; ++k)       for (i = 1; i <= n; ++i)         for (j = 1; j <= n; ++j)           for (l = 1; l <= k; ++l)             ans[i][k] = (ans[i][k] + ans[j][k - l] * fe[j][i][l]) % M;     for (k = 1; k <= 2 * n; ++k) {       long long s = 0;       for (i = 1; i <= n; ++i) s = (s + ans[i][k]) % M;       cout << s << endl;     }   }