#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10,M=1e4+10;
int n,m,res,p[N],a[N],f[N],level[N];
int e[N],ne[N],h[N],idx;
bool vis[N],mp[M][M];
typedef pair<int,int>pii;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dijkstra()
{
priority_queue<pii,vector<pii>,greater<pii>>que;
que.push({0,0}); level[0]=0;
while(!que.empty()){
auto now=que.top(); que.pop();
int x=now.second,y=now.first;
if(vis[x]) continue; vis[x]=true;
for(int i=h[x];i!=-1;i=ne[i]){
int j=e[i];
if(level[j]<level[x]+1){
level[j]=level[x]+1;
que.push({level[j],j});
}
}
}
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
memset(level,-0x3f,sizeof level);
for(int i=0;i<m;i++){
int x; cin>>x;
memset(vis,false,sizeof vis);
for(int j=0;j<x;j++) cin>>a[j],vis[a[j]]=true;
for(int j=a[0];j<=a[x-1];j++){
if(vis[j]) continue;
for(int e=0;e<x;e++)
if(!mp[a[e]][j]) mp[a[e]][j]=true,add(j,a[e]),p[j]++;
}
}
for(int i=1;i<=n;i++) add(0,i);
memset(vis,false,sizeof vis);
dijkstra();
for(int i=1;i<=n;i++) res=max(res,level[i]);
cout<<res+1;
return 0;
}