#include<cstring>
#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
struct node{
int nex;
}a[310000];
struct edge{
int y,nex;
}e[620000];
int d[310000][2];
int f[310000];
int tot[310000];
int top[310000];
int n,m,p,size;
void add(int x,int y){
p++;
e[p].nex=a[x].nex;
a[x].nex=p;
e[p].y=y;
}
void init(){
freopen("worma.in","r",stdin);
freopen("worma.out","w",stdout);
scanf("%d%d",&n,&m);
p=0;
int x,y;
for (int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
}
void dfs(int s){
int t=a[s].nex;
while (t!=0){
if (e[t].y!=f[s]){
tot[s]++;
f[e[t].y]=s;
dfs(e[t].y);
}
t=e[t].nex;
}
top[++size]=s;
}
void work(){
memset(f,false,sizeof(f));
dfs(1);
int re=0;
for (int k=1;k<=size;k++){
int s=top[k];
d[s][0]=d[s][1]=-0x7fffffff;
int t=a[s].nex;
while (t!=0){
if (e[t].y!=f[s]){
int nd;
if (tot[e[t].y]) nd=d[e[t].y][0]+tot[e[t].y];
else nd=d[e[t].y][0]+1;
if(nd>d[s][0]){
d[s][1]=d[s][0];
d[s][0]=nd;
}else if (nd>d[s][1]){
d[s][1]=nd;
}
}
t=e[t].nex;
}
if (tot[s]==0) d[s][0]=0;
else if (tot[s]>=2){
int nre=d[s][0]+d[s][1]+tot[s]-2+(s!=1);
if (nre>re)
re=nre;
}
}
printf("%d",re+1);
}
int main(){
init();
work();
return 0;
}