#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
#define mem(a,m) memset(a,m,sizeof(a))
const int maxn = 2010;
bool vis[maxn];
vector<int> adj[maxn];
int ind[maxn];
queue<int> q;
int lev[maxn],ans;
int x[maxn];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int s;
cin >> s;
for(int j=1;j<=s;j++){
cin>>x[j];
adj[n+i].push_back(x[j]);
ind[x[j]] ++;
if (j != 1){
for(int k=x[j-1] + 1;k<=x[j]-1;k++){
adj[k].push_back(n+i);
ind[n+i] ++ ;
}
}
}
}
for(int i=1;i<=n;i++){
if(ind[i] == 0) {
lev[i] = 1;
q.push(i);
}
}
while (!q.empty()){
int tp = q.front();
q.pop();
for(int i=0;i<adj[tp].size();i++){
int v = adj[tp][i];
lev[v] = lev[tp] + !(v > n);
ans = max(ans,lev[v]);
ind[v] -- ;
if(ind[v] == 0){
q.push(v);
}
}
}
cout << ans << endl;
return 0;
}