#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
queue <long long> ii;
int ans,n,i,j,t,head,m,s1,s2,k,tmp;
int num[2000],l[2000][2000],cnt[2000],up[2000],down[2000];
bool v[2000],vis[2000][2000];
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
s1=0;
s2=0;
memset(v,false,sizeof(v));
scanf("%d",&tmp);
for(j=1;j<=tmp;j++)
{
scanf("%d",&t);
up[++s1]=t;
v[t]=true;
}
for(j=1;j<=n;j++)
{
if(!v[i])
{
down[++s2]=i;
}
}
for(j=1;j<=s2;j++)
{
for(k=1;k<=s1;k++)
{
if(!vis[down[j]][up[k]])
{
l[down[j]][++cnt[down[j]]]=up[k];
num[up[k]]++;
vis[down[j]][up[k]]=vis[up[k]][down[j]]=true;
}
}
}
}
for(i=1;i<=n;i++)
{
if(num[i]==0)
{
ii.push(i);
}
}
while(n)
{
tmp=ii.size();
for(i=1;i<=tmp;i++)
{
head=ii.front();
ii.pop();
for(j=1;j<=cnt[head];j++)
{
num[l[head][j]]--;
if(num[l[head][j]]==0)
{
ii.push(l[head][j]);
}
}
n--;
}
ans++;
}
printf("%d",ans);
}