1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <cstdio>
#include <vector>
using namespace std;

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define VAR(v,w) __typeof(w) v=(w)
#define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it)
#define SIZE(c) ((int)(c).size())

typedef vector<int> VI;

int n, m;
vector<vector<short> > h;
vector<short> s;

template<class T>
class KMP {
	const T& pat, seq;
	VI pi;
	int i, j;
public:
	KMP(const T& pat, const T& seq) : pat(pat), seq(seq), pi(SIZE(pat) + 1){
		j = pi[0] = 0;
		FOR(k,1,SIZE(pat)) {
			pi[k] = j;
			while (j && pat[k] != pat[j]) j = pi[j];
			if (pat[k] == pat[j]) j++;
		}
		pi[SIZE(pat)] = j;
		init();
	}
	void init() {
		i = j = 0;
	}
	int get() {
		if (i == SIZE(seq)) return -1;
		do {
			while (j && (j == SIZE(pat) || seq[i] != pat[j])) j = pi[j];
			if (seq[i] == pat[j]) j++;
			i++;
		} while (i < SIZE(seq) && j < SIZE(pat));
		if (j < SIZE(pat)) return -1;
		return i - SIZE(pat);
	}
};

int main() {
	scanf("%d%d", &n, &m);
	h.resize(n);
	REP(i,n) {
		int l;
		scanf("%d", &l);
		h[i].resize(l);
		REP(k,l) {
			scanf("%hd", &h[i][k]);
			--h[i][k];
		}
	}
	s.resize(m);
	REP(j,m) {
		scanf("%hd", &s[j]);
		--s[j];
	}
	if (s.size() == 1 && !s[0]) {
		printf("1\n");
		return 0;
	}
	vector<short> v(1);
	int i = 2;
	for (;;) {
		vector<short> w;
		FORE(it,v) {
			w.insert(w.end(), h[*it].begin(), h[*it].end());
			if (w.size() >= 50000000) {
				printf("-1\n");
				return 0;
			}
		}
		if (KMP<vector<short> >(s, w).get() >= 0) {
			printf("%d\n", i);
			return 0;
		}
		++i;
		swap(v, w);
	}
}