hexz01 @ 2023-10-04 22:15:51
#include <iostream>
#include <queue>
using namespace std;
const int N=1007, M=1000007;
int n, m;
int s[N][N];
int head[N], nxt[M<<1], to[M<<1], in[N], tot=0;//u->v: level[u]<level[v]
bool f[N];
void add(int u, int v){
tot++;
nxt[tot]=head[u];
head[u]=tot;
to[tot]=v;
in[v]++;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>s[i][0];
for(int j=1;j<=s[i][0];j++){
cin>>s[i][j];
}
for(int j=1;j<=s[i][0];j++){
for(int k=1;k<s[i][0];k++){
for(int t=s[i][k]+1;t<s[i][k+1];t++){
add(t, s[i][j]);
f[t]=1;f[s[i][j]]=1;
}
}
}
}
int cnt=0;
for(int i=1;i<=n;i++){
cnt+=f[i];
}
queue<int> q;
int ans=0;
while(cnt){
for(int i=1;i<=n;i++){
if(in[i]==0 && f[i]){
q.push(i);
f[i]=0;
cnt--;
}
}
while(q.size()){
int now=q.front();q.pop();
for(int i=head[now];i;i=nxt[i]){
int v=to[i];
if(f[v]) in[v]--;
}
}
ans++;
}
cout<<ans<<endl;
return 0;
}