#include <cstdio>
#include <stack>
#include <cmath>
#include <algorithm>
using namespace std;
struct Edge{
int next;
int to;
int w;
int u;
int bh;
}es[2000005][2];
int n,m;
int head[1000005][2],cnt[2];
void add(int u,int v,int w,int b,int bh=-1){
es[cnt[b]][b].next=head[u][b];
es[cnt[b]][b].to=v;
es[cnt[b]][b].w=w;
es[cnt[b]][b].u=u;
es[cnt[b]][b].bh=bh;
head[u][b]=cnt[b];
cnt[b]++;
}
int par[1000005];
int find(int id){
return id==par[id]?par[id]:par[id]=find(par[id]);
}
int fcnt;
int dfn[1000005],sjj,low[1000005],fdxx[1000005];
stack<int> sta;
stack<int> sta2;
void Tarjan(int u,int fa){
sta.push(u);
dfn[u]=low[u]=sjj;
sjj++;
for(int i=head[u][0];i;i=es[i][0].next){
int v=es[i][0].to;
if(!dfn[v]){
Tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
while(!sta2.empty()){
sta2.pop();
}
while(sta.top()!=u){
sta2.push(sta.top());
sta.pop();
}
sta2.push(u);
if(sta2.size()>=3){
int bq=0;
fdxx[fcnt]=sta2.size();
while(!sta2.empty()){
if(bq>fdxx[fcnt]/2){
add(sta2.top(),fcnt,fdxx[fcnt]-bq,1,bq+1);
add(fcnt,sta2.top(),fdxx[fcnt]-bq,1,bq+1);
}
else{
add(sta2.top(),fcnt,bq,1,bq+1);
add(fcnt,sta2.top(),bq,1,bq+1);
}
par[find(sta2.top())]=find(fcnt);
sta2.pop();
bq++;
}
fcnt++;
}
}
}
else{
low[u]=min(low[u],dfn[v]);
}
}
}
int dp[1000005];
int anszj;
int hsjl(int a,int b,int fdx){
return min(abs(a-b),fdx-abs(a-b));
}
void dfs1(int u,int fa){
for(int i=head[u][1];i;i=es[i][1].next){
int v=es[i][1].to;
if(v==fa){
continue;
}
dfs1(v,u);
if(u<=n){
anszj=max(anszj,dp[u]+dp[v]+es[i][1].w);
}
dp[u]=max(dp[u],dp[v]+es[i][1].w);
}
if(u>n){
for(int i=head[u][1];i;i=es[i][1].next){
int v=es[i][1].to;
if(v==fa){
continue;
}
for(int j=head[u][1];j;j=es[j][1].next){
int v1=es[j][1].to;
if(v==v1){
continue;
}
if(v1==fa){
continue;
}
anszj=max(anszj,dp[v]+dp[v1]+hsjl(es[j][1].bh,es[i][1].bh,fdxx[u]));
}
}
}
}
int main(){
cnt[0]=cnt[1]=sjj=1;
for(int i=1;i<=1000000;i++){
par[i]=i;
}
scanf("%d%d",&n,&m);
while(m--){
int k;
scanf("%d",&k);
int x,y;
scanf("%d",&x);
for(int i=1;i<k;i++){
scanf("%d",&y);
add(x,y,1,0);
add(y,x,1,0);
x=y;
}
}
fcnt=n+1;
Tarjan(1,-1);
for(int i=1;i<cnt[0];i++){
int x=es[i][0].u;
int y=es[i][0].to;
int fx=find(x);
int fy=find(y);
if(fx!=fy){
add(x,y,es[i][0].w,1);
add(y,x,es[i][0].w,1);
par[fx]=fy;
}
}
dfs1(1,-1);
printf("%d",anszj);
return 0;
}