求调
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3*10e5+3;
//const int N=15;
int n,n_edge;
struct edge{
int to,next;
}e[N<<1];
int head[N],idx=0;
ll ans=0;
void addedge(int a,int b){
e[idx].to=b;e[idx].next=head[a];
head[a]=idx++;
}
ll f[N],c[N];
void dsf(int x,int fa){
ll d1=0,d2=0;//最大儿子🐛
for(int i=head[x];i!=-1;i=e[i].next){
int v=e[i].to;
if(v==fa) continue;
c[x]++;
dsf(v,x);
f[x]=max(f[x],f[v]);
if(f[v]>=d1){d2=d1;d1=f[v];}
else if(f[v]>d2) d2=f[v];
}
if(!c[x]) {f[x]=1;return;}
f[x]+=1+max((ll)0,c[x]-1);
ans=max(ans,f[x]+d2-1);
}
int main(){
memset(head,-1,sizeof head);
scanf("%d%d",&n,&n_edge);
for(int i=1;i<n;++i){
int t1,t2;
scanf("%d%d",&t1,&t2);
addedge(t1,t2);
addedge(t2,t1);
}
dsf(1,-1);
cout<<ans;
}