#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int w = 0, x = 0;
  char c = getchar();
  while (!isdigit(c)) w |= c == '-', c = getchar();
  while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
  return w ? -x : x;
}
namespace star {
const int maxn = 55, maxm = 2505, mod = 1e9 + 7;
int n, m, ecnt, f[maxn << 1][maxn][2], u[maxm], v[maxm], head[maxn], to[maxm],
    nxt[maxm], w[maxm], type[maxm], pos[maxm], G1[maxn][maxn], G2[maxn][maxn];
bool s[maxm], t[maxm];
vector<int> g[maxm];
inline void addedge(int a, int b, int c, bool d, bool e) {
  to[++ecnt] = b, nxt[ecnt] = head[a], head[a] = ecnt, w[ecnt] = c, s[ecnt] = d,
  t[ecnt] = e;
}
inline void work() {
  n = read(), m = read();
  for (int i = 1; i <= m; i++) {
    int u = star::u[i] = read(), v = star::v[i] = read(), x = read();
    while (x--) g[i].push_back(read());
    G1[u][v] = G2[v][u] = i;
    if (!g[i].size()) {
      type[i] = 4;
      continue;
    }
    for (int j = 0; j < g[i].size() - 1; j++)
      if (g[i][j] == u and g[i][j + 1] == v) type[i] = 1, pos[i] = j;
    if (g[i].back() == u) type[i] = 2;
    if ((*g[i].begin()) == v) type[i] = 3;
  }
  for (int i = 1; i <= m; i++) {
    int S, T;
    static int q[maxn << 1];
    switch (type[i]) {
      case 1: {
        int len = 1, hd = 0, tl = 0;
        for (int j = pos[i] - 1; ~j; j--) q[++tl] = g[i][j];
        S = u[i], T = v[i];
        while (hd < tl) {
          int x = q[++hd];
          if (++len > n * 2 or !G2[S][x]) goto End;
          for (vector<int>::reverse_iterator it = g[G2[S][x]].rbegin();
               it != g[G2[S][x]].rend(); it++)
            q[++tl] = (*it);
          S = x;
        }
        hd = tl = 0;
        for (int j = pos[i] + 2; j < g[i].size(); j++) q[++tl] = g[i][j];
        while (hd < tl) {
          int x = q[++hd];
          if (++len > n * 2 or !G1[T][x]) goto End;
          for (auto u : g[G1[T][x]]) q[++tl] = u;
          T = x;
        }
        addedge(S, T, len, 1, 1);
        break;
      }
      case 2: {
        int len = 1, hd = 0, tl = 0;
        for (int j = g[i].size() - 2; ~j; j--) q[++tl] = g[i][j];
        S = u[i], T = v[i];
        while (hd < tl) {
          int x = q[++hd];
          if (++len > n * 2 or !G2[S][x]) goto End;
          for (vector<int>::reverse_iterator it = g[G2[S][x]].rbegin();
               it != g[G2[S][x]].rend(); it++)
            q[++tl] = (*it);
          S = x;
        }
        addedge(S, T, len, 1, 0);
        break;
      }
      case 3: {
        int len = 1, hd = 0, tl = 0;
        for (int j = 1; j < g[i].size(); j++) q[++tl] = g[i][j];
        S = u[i], T = v[i];
        while (hd < tl) {
          int x = q[++hd];
          if (++len > n * 2 or !G1[T][x]) goto End;
          for (auto u : g[G1[T][x]]) q[++tl] = u;
          T = x;
        }
        addedge(S, T, len, 0, 1);
        break;
      }
      case 4:
        addedge(u[i], v[i], 1, 0, 0);
    }
  End:;
  }
  for (int i = 1; i <= n; i++) f[0][i][0] = 1;
  for (int l = 0; l <= (n << 1); l++)
    for (int x = 1; x <= n; x++)
      for (int i = head[x]; i; i = nxt[i])
        if (l + w[i] <= (n << 1))
          f[l + w[i]][to[i]][t[i]] =
              (f[l + w[i]][to[i]][t[i]] + f[l][x][s[i] ^ 1]) % mod;
  for (int i = 1; i <= n << 1; i++) {
    int ans = 0;
    for (int j = 1; j <= n; j++) ans = (ans + f[i][j][1]) % mod;
    printf("%d\n", ans);
  }
}
}  // namespace star
signed main() {
  star::work();
  return 0;
}
