#include<bits/stdc++.h>
#define inl inline
#define re register
#define ll long long
using namespace std;
inl int read() {
int sum=0,f=1;char c=getchar();
while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}
while(isdigit(c)) {sum=(sum<<3)+(sum<<1)+(c^48);c=getchar();}
return sum*f;
}
const int N=1010;
int n,m,head[N],tot;
struct node{
int to,nxt;
}e[N<<1];
inl void add(int u,int v) {
e[++tot].to=v;
e[tot].nxt=head[u];
head[u]=tot;
}
int s[N][N],ans,r[N];
bool vis[N],v[N][N];
struct Node {
int u,level;
};
inl void top() {
queue<Node> q;
for(re int i=1;i<=n;i++) {
if(!r[i]) q.push(Node{i,1});
}
ans=1;
while(!q.empty()) {
Node tmp=q.front();
q.pop();
int u=tmp.u,l=tmp.level;
for(re int i=head[u];i;i=e[i].nxt) {
int v=e[i].to;
r[v]--;
if(!r[v]) {
q.push(Node{v,l+1});
ans=max(ans,l+1);
}
}
}
}
int main() {
n=read(),m=read();
for(re int i=1;i<=m;i++) {
s[i][0]=read();
memset(vis,0,sizeof(vis));
for(re int j=1;j<=s[i][0];j++) {
s[i][j]=read();
vis[s[i][j]]=1;
}
for(re int j=s[i][1];j<=s[i][s[i][0]];j++) {
if(vis[j]) continue;
for(re int k=1;k<=s[i][0];k++) {
if(!v[j][s[i][k]]) {
add(j,s[i][k]);
r[s[i][k]]++;
v[j][s[i][k]]=1;
}
}
}
}
top();
printf("%d\n",ans);
return 0;
}