#include<cstdio>
#include<vector>
using namespace std;
#define N 1005
vector<int> G[N];
int n,m,c,d,e,x=0,s[N],t[N],in[N],b[N];
char a[N][N];
int main(){
scanf("%d%d",&n,&m);
while(m--){
scanf("%d",&c);
for(int i=1;i<=c;i++)scanf("%d",&s[i]);
d=0;
for(int i=1;i<c;i++)
for(int j=s[i]+1;j<=s[i+1]-1;j++)t[++d]=j;
for(int i=1;i<=c;i++)
for(int j=1;j<=d;j++)
if(a[s[i]][t[j]]==0){
G[s[i]].push_back(t[j]); a[s[i]][t[j]]=1; in[t[j]]++;
}
}
while(1){
int k=0;
for(int i=1;i<=n;i++)
if(in[i]==0){b[++k]=i; in[i]=1;}
if(k==0)break;
x++;
for(int i=1;i<=k;i++)
for(int j=0;j<G[b[i]].size();j++)
in[G[b[i]][j]]--;
}
printf("%d\n",x);
return 0;
}
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define N 1005
vector<int> G[N];
queue<int> Q;
int n,m,c,d,e,x=1,s[N],t[N],in[N],lv[N];
char a[N][N];
int main(){
scanf("%d%d",&n,&m);
while(m--){
scanf("%d",&c);
for(int i=1;i<=c;i++)scanf("%d",&s[i]);
d=0;
for(int i=1;i<c;i++)
for(int j=s[i]+1;j<=s[i+1]-1;j++)t[++d]=j;
for(int i=1;i<=c;i++)
for(int j=1;j<=d;j++)
if(a[s[i]][t[j]]==0){
G[s[i]].push_back(t[j]); a[s[i]][t[j]]=1; in[t[j]]++;
}
}
for(int i=1;i<=n;i++)
if(in[i]==0){Q.push(i); lv[i]=1;}
while(!Q.empty()){
e=Q.front(); Q.pop();
for(int i=0;i<G[e].size();i++)
if(--in[G[e][i]]==0){Q.push(G[e][i]); x=lv[G[e][i]]=lv[e]+1; }
}
printf("%d\n",x);
return 0;
}
//建图也能超时?
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define N 1005
vector<int> G[N];
queue<int> Q;
int n,m,c,d,e,x=1,s[N],t[N],in[N],lv[N];
bool find(int u,int v){
for(int i=0;i<G[u].size();++i)
if(G[u][i]==v)return true;
return false;
}
int main(){
scanf("%d%d",&n,&m);
while(m--){
scanf("%d",&c);
for(int i=1;i<=c;i++)scanf("%d",&s[i]);
d=0;
for(int i=1;i<c;i++)
for(int j=s[i]+1;j<=s[i+1]-1;j++)t[++d]=j;
for(int i=1;i<=c;i++)
for(int j=1;j<=d;j++)
if(!find(s[i],t[j])){G[s[i]].push_back(t[j]); in[t[j]]++;}
}
for(int i=1;i<=n;i++)
if(in[i]==0){Q.push(i); lv[i]=1;}
while(!Q.empty()){
e=Q.front(); Q.pop();
for(int i=0;i<G[e].size();i++)
if(--in[G[e][i]]==0){Q.push(G[e][i]); x=lv[G[e][i]]=lv[e]+1; }
}
printf("%d\n",x);
return 0;
}
var s,t,i,j,k,l,m,n,s2,ans,ss:longint; a,x:array[0..1020,0..1020]of longint; d,Q,t1,t2,lv:array[0..1020]of longint; bo:boolean; begin readln(n,m); for i:=1 to m do begin read(s); for j:=1 to s do read(t1[j]); s2:=0; for j:=1 to s-1 do for k:=t1[j]+1 to t1[j+1]-1 do begin inc(s2);t2[s2]:=k; end; for j:=1 to s do for k:=1 to s2 do a[t1[j],t2[k]]:=1; end; for i:=1 to n do for j:=1 to n do if a[i,j]=1 then begin inc(d[j]); inc(x[i,0]); x[i,x[i,0]]:=j; end; s:=0; t:=0; for i:=1 to n do if d[i]=0 then begin Q[s]:=i; inc(s); end; while(s>t) do begin for i:=1 to x[Q[t],0] do begin dec(d[x[Q[t],i]]); if d[x[Q[t],i]]=0 then begin Q[s]:=x[Q[t],i]; lv[Q[s]]:=lv[Q[t]]+1; inc(s); end; end; inc(t); end; writeln(lv[Q[t-1]]+1); end.