#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1310;
const pair<int, int> LOSE = make_pair(-1, -1);
const int MOD = 1e9 + 7;
vector<int> r[55][55];
int n, m;
bool he[55][55];
class Edge {
 public:
  int x, y, lenth;
  Edge() {}
  Edge(int x, int y, int len) : x(x), y(y), lenth(len) {}
} ein[MAXN];
class Road {
 public:
  int t, next, v;
  int type;
} e[MAXN * 2];
int p[MAXN];
int z = -1;
void addA(int x, int y, int len) {
  ++z;
  e[z].t = x;
  e[z].next = p[y];
  e[z].v = len;
  e[z].type = 0;
  p[y] = z;
}
void addB(int x, int y, int len) {
  ++z;
  e[z].t = x;
  e[z].next = p[y];
  e[z].v = len;
  e[z].type = 1;
  p[y] = z;
}
void addC(int x, int y, int len) {
  ++z;
  e[z].t = x;
  e[z].next = p[y];
  e[z].v = len;
  e[z].type = 2;
  p[y] = z;
}
void addD(int x, int y, int len) {
  ++z;
  e[z].t = x;
  e[z].next = p[y];
  e[z].v = len;
  e[z].type = 3;
  p[y] = z;
}
int lnow[211];
pair<int, int> findl(int stx, int sty, int stnum) {
  int st = 0, ed = 0;
  for (int i = stnum; i >= 0; --i) lnow[ed++] = r[stx][sty][i];
  if (ed >= 2 * n) return LOSE;
  int now = stx;
  int cntlen = 1;
  while (ed > st) {
    if (!he[lnow[st]][now]) return LOSE;
    if (ed >= 2 * n) return LOSE;
    for (int i = r[lnow[st]][now].size() - 1; i >= 0; --i)
      lnow[ed++] = r[lnow[st]][now][i];
    now = lnow[st];
    cntlen++;
    st++;
  }
  return make_pair(now, cntlen);
}
pair<int, int> findr(int stx, int sty, int stnum) {
  int st = 0, ed = 0;
  for (int i = stnum; i < r[stx][sty].size(); ++i) lnow[ed++] = r[stx][sty][i];
  if (ed >= 2 * n) return LOSE;
  int now = sty;
  int cntlen = 1;
  while (ed > st) {
    if (ed >= 2 * n) return LOSE;
    if (!he[now][lnow[st]]) return LOSE;
    for (int i = 0; i < r[now][lnow[st]].size(); ++i)
      lnow[ed++] = r[now][lnow[st]][i];
    now = lnow[st];
    cntlen++;
    st++;
  }
  return make_pair(now, cntlen);
}
int f[61][111][5] = {};
int ans[111];
void solve() {
  for (int i = 1; i <= n; ++i) f[i][0][3] = 1;
  for (int j = 1; j <= 2 * n; ++j) {
    for (int i = 1; i <= n; ++i) {
      for (int tmp = p[i]; tmp != -1; tmp = e[tmp].next) {
        if (e[tmp].v > j) continue;
        if (!e[tmp].type) {
          (f[i][j][0] += f[e[tmp].t][j - e[tmp].v][2]) %= MOD;
          (f[i][j][0] += f[e[tmp].t][j - e[tmp].v][3]) %= MOD;
        } else if (e[tmp].type == 1) {
          (f[i][j][1] += f[e[tmp].t][j - e[tmp].v][0]) %= MOD;
          (f[i][j][1] += f[e[tmp].t][j - e[tmp].v][1]) %= MOD;
        } else if (e[tmp].type == 2) {
          (f[i][j][2] += f[e[tmp].t][j - e[tmp].v][2]) %= MOD;
          (f[i][j][2] += f[e[tmp].t][j - e[tmp].v][3]) %= MOD;
        } else {
          (f[i][j][3] += f[e[tmp].t][j - e[tmp].v][0]) %= MOD;
          (f[i][j][3] += f[e[tmp].t][j - e[tmp].v][1]) %= MOD;
        }
      }
    }
  }
  for (int i = 1; i <= 2 * n; ++i)
    for (int j = 1; j <= n; ++j) ans[i] += (f[j][i][0] + f[j][i][1]) % MOD;
}
int main() {
  memset(p, -1, sizeof(p));
  scanf("%d%d", &n, &m);
  int val;
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d%d", &ein[i].x, &ein[i].y, &ein[i].lenth);
    he[ein[i].x][ein[i].y] = true;
    if (!ein[i].lenth) addD(ein[i].x, ein[i].y, 1);
    for (int j = 1; j <= ein[i].lenth; ++j) {
      scanf("%d", &val);
      r[ein[i].x][ein[i].y].push_back(val);
    }
  }
  for (int i = 1; i <= m; ++i) {
    if (!ein[i].lenth) continue;
    if (r[ein[i].x][ein[i].y][0] == ein[i].y) {
      pair<int, int> cu = findr(ein[i].x, ein[i].y, 1);
      if (cu.first != -1) {
        addB(ein[i].x, cu.first, cu.second);
      }
    }
    if (r[ein[i].x][ein[i].y][r[ein[i].x][ein[i].y].size() - 1] == ein[i].x) {
      pair<int, int> cu =
          findl(ein[i].x, ein[i].y, r[ein[i].x][ein[i].y].size() - 2);
      if (cu.first != -1) {
        addC(cu.first, ein[i].y, cu.second);
      }
    }
    for (int j = 0; j < r[ein[i].x][ein[i].y].size() - 1; ++j) {
      if (r[ein[i].x][ein[i].y][j] == ein[i].x &&
          r[ein[i].x][ein[i].y][j + 1] == ein[i].y) {
        pair<int, int> lef = findl(ein[i].x, ein[i].y, j - 1);
        pair<int, int> rig = findr(ein[i].x, ein[i].y, j + 2);
        if (lef.first != -1 && rig.first != -1) {
          addA(lef.first, rig.first, lef.second + rig.second - 1);
        }
      }
    }
  }
  solve();
  for (int i = 1; i <= 2 * n; ++i) printf("%d\n", ans[i]);
  return 0;
}
