#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int myrand() { return abs((rand() << 15) ^ rand()); }
inline int rnd(int x) { return myrand() % x; }
const int INF = (int)1e9 + 1;
const long double EPS = 1e-9;
const int maxn = 50 + 5;
int go[maxn][maxn], ids[maxn][maxn];
const int maxm = maxn * (maxn - 1) / 2;
vector<int> inside[maxm];
bool check(int rev, vector<int> &cur, int maxLen) {
  for (int i = 0; i < ((int)(cur).size()) - 1 && ((int)(cur).size()) <= maxLen;
       ++i) {
    int s = cur[i], t = cur[i + 1];
    if (rev) {
      swap(s, t);
    }
    if (!go[s][t]) {
      return 0;
    }
    int id = ids[s][t];
    for (int pos = 0;
         pos < ((int)(inside[id]).size()) && ((int)(cur).size()) <= maxLen;
         ++pos) {
      cur.push_back(
          inside[id][rev ? (((int)(inside[id]).size()) - 1 - pos) : pos]);
    }
  }
  return ((int)(cur).size()) <= maxLen;
}
bool solve() {
  int n, m;
  if (scanf("%d%d", &n, &m) < 2) {
    return 0;
  }
  assert(n <= maxn && m <= maxm);
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      go[i][j] = 0, ids[i][j] = -1;
    }
  }
  for (int i = 0; i < m; ++i) {
    int s, t, k;
    scanf("%d%d%d", &s, &t, &k);
    --s, --t;
    go[s][t] = 1;
    ids[s][t] = i;
    inside[i].resize(k);
    for (int j = 0; j < k; ++j) {
      scanf("%d", &inside[i][j]);
      --inside[i][j];
    }
  }
  for (int s = 0; s < n; ++s) {
    for (int t = 0; t < n; ++t) {
      if (!go[s][t]) {
        continue;
      }
      int id = ids[s][t];
      for (int pos = 0; pos < ((int)(inside[id]).size()) - 1; ++pos) {
        if (inside[id][pos] != s || inside[id][pos + 1] != t) {
          continue;
        }
        vector<int> cur;
        for (int j = pos + 1; j < ((int)(inside[id]).size()); ++j) {
          cur.push_back(inside[id][j]);
        }
        if (check(0, cur, 2 * n - pos - 1)) {
          vector<int> right = cur;
          cur.clear();
          for (int j = pos; j >= 0; --j) {
            cur.push_back(inside[id][j]);
          }
          if (check(1, cur, 2 * n - ((int)(right).size()))) {
            reverse(cur.begin(), cur.end());
            printf("%d\n", ((int)(cur).size()) + ((int)(right).size()));
            for (int it = 0; it < 2; ++it) {
              vector<int> &toprint = (!it ? cur : right);
              for (int i = 0; i < ((int)(toprint).size()); ++i) {
                printf("%d%c", toprint[i] + 1,
                       " \n"[it && i == ((int)(toprint).size()) - 1]);
              }
            }
            return 1;
          }
        }
      }
    }
  }
  printf("0\n");
  return 1;
}
int main() {
  srand(rdtsc());
  while (1) {
    if (!solve()) break;
  }
  return 0;
}
