#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<cstring>usingnamespacestd;
constint maxn = 1010;
int ting[maxn], vis[maxn];
vector<int>G[maxn]; int in[maxn]; int book[maxn][maxn];
int main(){
int n, m; cin>>n>>m;
for(int i = 1; i <= m; i++){
memset(vis,0,sizeof(vis));
int x; cin>>x;
for(int j = 1; j <= x; j++){ cin>>ting[j]; vis[ting[j]]=1;}
for(int j = ting[1]; j <= ting[x]; j++){//按照顺序的,开始站到终点站之间的每一个站if(vis[j])continue;//枚举没停的for(int k = 1; k <= x; k++)//枚举停了的
{//连一条边if(book[j][ting[k]])continue;//判重优化时间else book[j][ting[k]] = 1;
G[j].push_back(ting[k]); in[ting[k]]++;
}
}
}
int ans = 1;
//topusortqueue<pair<int, int> >q;
for(int i = 1; i <= n; i++)if(in[i]==0)q.push(make_pair(i,1));//入度为0while(q.size()){
int u = q.front().first, v = q.front().second; q.pop();
for(int i = 0; i < G[u].size(); i++)
if(--in[G[u][i]] == 0){q.push(make_pair(G[u][i],v+1));ans = max(ans,v+1);}
}
cout<<ans<<'\n';
return0;
}