solution
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
inline int read(){
char ch=' ';int f=1;int x=0;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int M=1e6+100;
const int N=1e3+10;
struct node
{
int v,nxt;
}edge[M];
int head[N],cnt;
void add(int u,int v)
{
cnt++;
edge[cnt].v=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
bool vis[N];
int a[N];
int in[N];
queue <pair<int,int> > q;
bool b[N][N];
int main()
{
int n,m;
n=read();m=read();
int i,j,k;
for(i=1;i<=m;i++)
{
memset(vis,0,sizeof(vis));
int s=read();
for(j=1;j<=s;j++) a[j]=read(),vis[a[j]]=true;
for(j=a[1];j<=a[s];j++)
{
if(!vis[j])
{
for(k=1;k<=s;k++)
{
if(!b[a[k]][j])
add(a[k],j),in[j]++,b[a[k]][j]=true;
}
}
}
}
for(i=1;i<=n;i++)
{
if(!in[i])
{
q.push(make_pair(i,1));
}
}
int ans=0;
while(!q.empty())
{
int u=q.front().first;
int tot=q.front().second;q.pop();
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].v;
in[v]--;
if(!in[v])
{
q.push(make_pair(v,tot+1));
ans=max(ans,tot+1);
}
}
}
cout<<ans<<endl;
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<vector>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
inline int read(){
char ch=' ';int f=1;int x=0;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int M=5e6+100;
const int N=1e3+10;
bool vis[N];
int a[N];
int in[N];
bool cnm[N][N];
vector <int> g[N];
queue <pair<int,int> > q;
int main()
{
int n,m;
n=read();m=read();
int i,j,k;
for(i=1;i<=m;i++)
{
memset(vis,0,sizeof(vis));
int s=read();
for(j=1;j<=s;j++) a[j]=read(),vis[a[j]]=true;
for(j=a[1];j<=a[s];j++)
if(!vis[j])
for(k=1;k<=s;k++)
if(!cnm[a[k]][j])
g[a[k]].push_back(j),in[j]++,cnm[a[k]][j]=true;
}
for(i=1;i<=n;i++)
if(!in[i])
q.push(make_pair(i,1));
int ans=0;
while(!q.empty())
{
int u=q.front().first;int tot=q.front().second;q.pop();
ans=max(ans,tot);
for(i=0;i<g[u].size();i++)
{
int v=g[u][i];
in[v]--;
if(!in[v])
{
q.push(make_pair(v,tot+1));
}
}
}
cout<<ans<<endl;
return 0;
}