#include<cstdio>
#include<algorithm>
using namespace std;
inline int read()
{
int x;char c;
while((c=getchar())<‘0‘||c>‘9‘);
for(x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;)x=(x<<3)+(x<<1)+c-‘0‘;
return x;
}
#define MN 50000
struct edge{int nx,t;}e[MN*4+5];
int h[MN+5],en,d[MN+5],l[MN+5],cnt,fa[MN+5],f[MN+5],ans,a[MN*2+5],an,q[MN*2+5],ql,qr;
inline void ins(int x,int y)
{
e[++en]=(edge){h[x],y};h[x]=en;
e[++en]=(edge){h[y],x};h[y]=en;
}
void tj(int x)
{
int i,j;d[x]=l[x]=++cnt;
for(i=h[x];i;i=e[i].nx)if(e[i].t!=fa[x])
{
if(!d[e[i].t])fa[e[i].t]=x,tj(e[i].t);
l[x]=min(l[x],l[e[i].t]);
if(l[e[i].t]>d[x])ans=max(ans,f[x]+f[e[i].t]+1),f[x]=max(f[x],f[e[i].t]+1);
}
for(i=h[x];i;i=e[i].nx)if(fa[e[i].t]!=x&&d[e[i].t]>d[x])
{
for(an=0,j=e[i].t;j!=x;j=fa[j])a[++an]=f[j];a[++an]=f[x];
for(j=1;j<=an;++j)a[j+an]=a[j];
for(j=ql=1,qr=0;j<=an<<1;++j)
{
while(ql<=qr&&j-q[ql]>an>>1)++ql;
if(ql<=qr)ans=max(ans,a[j]+a[q[ql]]+j-q[ql]);
while(ql<=qr&&a[j]-j>=a[q[qr]]-q[qr])--qr;
q[++qr]=j;
}
for(j=1;j<an;++j)f[x]=max(f[x],a[j]+min(an-j,j));
}
}
int main()
{
int n,m,k,x,y;
n=read();m=read();
while(m--)for(k=read(),x=read();--k;x=y)ins(x,y=read());
tj(1);
printf("%d",ans);
}