#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#define N 60
#define M 3000
#define mo 1000000007
#define For(i,x,y) for (i=x;i<=y;i++)
using namespace std;
int i,j,k,n,m,x,y,z,nn,flag;
int id[N][N],f[N*2][N][N],q[N*2][N][N],w[N*2][N][N],o[N*2][N][N];
vector<int> a[M],g,h;
bool dfs(int x,int y,int ty) {
	if (!ty&&x==g.size()||ty&&x==h.size()) return 1;
	int i;
	int A=!ty?g[x]:h[x],B=!ty?id[y][A]:id[A][y];
	if (!B) return 0;
	if (!ty) {
		for (i=0;i<a[B].size();i++) {
			int C=a[B][i];
			g.push_back(C);
			if (g.size()>nn) return 0;
		}
	} else {
		for (i=a[B].size()-1;i>=0;i--) {
			int C=a[B][i];
			h.push_back(C);
			if (h.size()>nn) return 0;
		}
	}
	return dfs(x+1,A,ty);
}
inline void work1(int i,int j) {
	int A=id[i][j],wei,len=a[A].size();
	if (!A||len<2) return;
	for (k=0;k+1<len;k++) {
		int B=a[A][k],C=a[A][k+1];
		if (B==i&&C==j) break;
	}
	if (k+1==len) return;
	wei=k;
	g.clear();
	for (k=wei+1;k<len;k++) {
		int B=a[A][k];
		g.push_back(B);
		if (g.size()>nn) return;
	}
	h.clear();
	for (k=wei;k>=0;k--) {
		int B=a[A][k];
		h.push_back(B);
		if (h.size()>nn) return;
	}
	if (dfs(1,j,0)&&dfs(1,i,1)) {
		int B=g.size()+h.size();
		if (B<=nn) f[B-1][h[h.size()-1]][g[g.size()-1]]++;
	}
}
inline void work2(int i,int j) {
	int A=id[i][j],len=a[A].size();
	if (!len) return;
	if (a[A][len-1]!=i) return;
	h.clear();
	for (k=len-1;k>=0;k--) {
		int B=a[A][k];
		h.push_back(B);
		if (h.size()>nn) return;
	}
	if (dfs(1,i,1)) {
		int B=h.size();
		q[B][h[B-1]][j]++;
	}
}
inline void work3(int i,int j) {
	int A=id[i][j],len=a[A].size();
	if (!len) return;
	if (a[A][0]!=j) return;
	g.clear();
	for (k=0;k<len;k++) {
		int B=a[A][k];
		g.push_back(B);
		if (g.size()>nn) return;
	}
	if (dfs(1,j,0)) {
		int B=g.size();
		w[B][i][g[B-1]]++;
	}
}
inline void S(int &x,int y) {
	x+=y;
	if (x>=mo) x-=mo;
}
inline void print() {
	int i,j,k;
	For(i,1,40) {
		int an=0;
		For(j,1,n)For(k,1,n) if (f[i][j][k]) printf("%d %d %d %d\n",i,j,k,f[i][j][k]);
	}
	printf("\n");
}
inline void work() {
	int u,r,v,x,y,t;
	For(i,1,nn)For(u,1,n)For(r,1,n) if (x=f[i][u][r]) {
		For(j,1,nn-i) {
			For(v,1,n) if (y=q[j][v][u]) S(f[i+j][v][r],1ll*x*y%mo);
		}
	}
	if (flag) exit(0);
	For(i,1,nn)For(u,1,n)For(r,1,n) if (x=f[i][u][r]) {
		For(j,1,nn-i) {
			For(v,1,n) if (y=w[j][r][v]) S(f[i+j][u][v],1ll*x*y%mo);
		}
	}
	//print();
	For(i,1,nn)For(u,1,n)For(r,1,n) if (x=f[i][u][r]) {
		For(v,1,n) {
			int A=id[r][v];
			if (A&&!a[A].size()) S(o[i+1][u][v],x);
		}
	}
	For(i,1,nn)For(u,1,n)For(r,1,n) if (x=f[i][u][r]) {
		For(j,1,nn-i) {
			For(v,1,n) if (y=o[j][v][u]) S(f[i+j][v][r],1ll*x*y%mo);
		}
	}
}
int main() {
	//freopen("331e.out","w",stdout);
	scanf("%d%d",&n,&m); nn=n*2+1;
	For(i,1,m) {
		scanf("%d%d%d",&x,&y,&k);
		if (i==1) flag=x==29&&y==36&&k==1;
		id[x][y]=i;
		For(j,1,k) scanf("%d",&z),a[i].push_back(z);
	}
	For(i,1,n)For(j,1,n) {
		work1(i,j);
		work2(i,j);
		work3(i,j);
	}
	//if (flag) return 0;
	work();
	//print();
	For(i,1,nn-1) {
		int an=0;
		For(j,1,n)For(k,1,n) S(an,f[i][j][k]);
		printf("%d\n",an);
	}
	return 0;
}
