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
88
89
90
91
92
93
94
95
96
97
98
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define F first
#define S second
#if true
#define int long long
#undef INT_MAX
#define INT_MAX LLONG_MAX
#endif
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vpi;
template <class T> using MinTree = priority_queue<T, vector<T>, greater<T>>;
template <class T> using MaxTree = priority_queue<T>;

// start of extra functions
#define all(v) (v).begin(), (v).end()
#define loop(i, n) sloop(0, i, n)
#define sloop(s, i, n) for (int i = (s); i < (n); i++)
#define rloop(i, n) rsloop(0, i, n)
#define rsloop(s, i, n) for (int i = (n); i-- > (s);)
int binsearch(int l, int h, function<int(int)> o, int m = -69) {
	for (int m; l + 1 < h; (o(m = (l + h) / 2) ? h : l) = m)
		;
	return l + 1;
}
int powint(int a, int b, int m = INT_MAX, int o = 1) {
	return a %= m, b ? powint(a * a, b / 2, m, (b & 1 ? a : 1) * o) : o;
}
// end of extra functions

// start of extra IO
template <class T, class U> istream &operator>>(istream &s, pair<T, U> &p) {
	return s >> p.F >> p.S;
}
template <class T> istream &operator>>(istream &s, vector<T> &v) {
	loop(i, v.size()) s >> v[i];
	return s;
}
template <class T, class U> ostream &operator<<(ostream &s, pair<T, U> p) {
	return s << '(' << p.F << ", " << p.S << ')';
}
template <class T> ostream &operator<<(ostream &s, vector<T> v) {
	s << '[';
	loop(i, v.size()) s << (i ? ", " : "") << v[i];
	return s << ']';
}
// end of extra IO

// start of dbg definiton
void _dbg(int line, char *fmt) { cout << "[" << line << "]" << fmt << endl; }
template <class T, class... U> void _dbg(int line, char *f, T a, U... r) {
	cout << (*f == ','		      ? f++,
		 string(5 + log10(line), ' ') : "[" + to_string(line) + "]: ");
	while (isspace(*f))
		f++;
	for (int d = 0; *f && (*f != ',' || d > 0);
	     d += strchr("[{(", *f) - strchr("]})", *f))
		cout << *f++;
	cout << " = " << a << endl;
	if (*f)
		_dbg(line, f, r...);
}
#define DBG(...) _dbg(__LINE__, #__VA_ARGS__ __VA_OPT__(, ) __VA_ARGS__);
// end of dbg definition

signed main() {
	cin.tie(0);
	ios::sync_with_stdio(0);
	int k, n1;
	cin >> k >> n1;
	vector<vi> r(k), in(k);
	r[0].resize(n1);
	in[0].resize(n1);
	sloop(1, i, k) {
		int n;
		cin >> n;
		r[i].resize(n);
		in[i].resize(n);
		loop(j, n) cin >> in[i][j];
	}
	int o = 0;
	rloop(i, k) {
		int s = 0;
		loop(j, r[i].size()) {
			if (r[i][j] == 0)
				r[i][j] = 1;
			if (i && in[i][j])
				r[i - 1][in[i][j] - 1] += r[i][j];
			s += r[i][j];
		}
		o = max(o,s);
	}
	//DBG(r);
	cout << o;
}