寄录
#include <iostream>
#include <queue>
using namespace std;
int s,a[1005],x[1005];
int in[1005],depth[1005];
int nxt[1000005],head[1000005],to[1000005],cnt=-1;
void add(int u, int v) {
nxt[++cnt] = head[u]; // 当前边的后继
head[u] = cnt; // 起点 u 的第一条边
to[cnt] = v; // 当前边的终点
}
queue<int> q;
int main(){
int n,m;
cin >> n >> m;
for (int i = 1; i <= n; i++) head[i] = -1;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) a[j] = 0;
cin >> s;
for (int j = 1; j <= s; j++){
cin >> x[j];
a[x[j]] = 1;
}
for (int j = 1; j <= s; j++){
for (int k = x[1]; k <= x[s]; k++){
if (!a[k]) {
add(x[j],k);
in[k]++;
}
}
}
}
for (int i = 1; i <= n; i++){
if (!in[i]) {
q.push(i);
depth[i] = 1;
}
}
while(q.size()){
int u = q.front();
q.pop();
for (int i = head[u]; i != -1; i = nxt[i]){
int v = to[i];
// depth[v] = max(depth[v],depth[u]+1);
in[v]--;
if (in[v] == 0){
q.push(v);
depth[v] = depth[u]+1;
}
}
}
int ans=0;
for (int i = 1; i <= n; i++)ans = max(ans,depth[i]);
cout << ans;
}