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
#include <cstdio>
#include <vector>

using namespace std;

vector<int> c = {0}, s;

int k(int i) {
	int sl = s.size();
	if(i <= sl) {
		return s[i-1];
	}
	if(i == sl+1)
		return -1;
	return c[i-sl-2];
}

bool kmp() {
	int sl = s.size(), cl = c.size();
	if(sl > cl)
		return false;
	vector<int> pref(1+sl+1+cl);
	pref[0] = 0;
	pref[1] = 0;
	int t = 0;
	for(int i = 2; i < sl+cl+2; i++) {
		while(t > 0 && k(t+1) != k(i))
			t = pref[t];
		if(k(t+1) == k(i))
			t++;
		pref[i] = t;
		if(i > sl+1 && pref[i] >= sl)
			return true;
	}
	return false;
}

int main() {
	int n, m;
	scanf("%d%d", &n, &m)?:0;
	vector<int> h[n];
	for(int i = 0; i < n; i++) {
		int l;
		scanf("%d", &l)?:0;
		for(int j = 0; j < l; j++) {
			int tmp;
			scanf("%d", &tmp)?:0;
			h[i].push_back(tmp-1);
		}
	}
	for(int i = 0; i < m; i++) {
		int tmp;
		scanf("%d", &tmp)?:0;
		s.push_back(tmp-1);
	}
	int wyn = 0;
	while(++wyn) {
		if(kmp()) {
			printf("%d\n", wyn);
			return 0;
		}
		vector<int> c_new;
		for(auto it = c.begin(); it != c.end(); it++) {
			c_new.insert(c_new.end(), h[*it].begin(), h[*it].end());
			if(c_new.size() > 10000000) {
				puts("-1");
				return 0;
			}
		}
		c.clear();
		c = c_new;
	}
	return 0;
}