#include<bits/stdc++.h>
using namespace std;
long long n,m,a,b,c,head[400005],cnt=1,maxdis,maxu,f[400005],o,k,f2[400005],ans2,kkk;
struct node{
long long to,nxt,w;
}edge[400005];
void add(long long u,long long v,long long ww){
edge[cnt].to=v,edge[cnt].w=ww;
edge[cnt].nxt=head[u];
head[u]=cnt++;
}
void dfs(long long u,long long fa,long long dis){
if(dis>maxdis) maxdis=dis,maxu=u;
for(long long i=head[u];i;i=edge[i].nxt) if(edge[i].to!=fa) dfs(edge[i].to,u,dis+edge[i].w);
}
void dfs2(long long x,long long fa){
for(long long i=head[x];i;i=edge[i].nxt){
if(edge[i].to!=fa){
f[edge[i].to]=f[x]+edge[i].w;
dfs2(edge[i].to,x);
}
}
}
void dfs3(long long x,long long fa){
for(long long i=head[x];i;i=edge[i].nxt){
if(edge[i].to!=fa){
f2[edge[i].to]=f2[x]+edge[i].w;
dfs3(edge[i].to,x);
}
}
}
int main(){
scanf("%lld%lld",&n,&m);
for(int i=0;i<m;i++){
scanf("%lld%lld%lld",&a,&b,&c);
add(a,b,c),add(b,a,c);
}
dfs(1,0,0);k=maxdis;maxu=0;
dfs(k,0,0);o=maxdis;
dfs2(k,0);
dfs3(o,0);
for(int i=1;i<=n;i++) ans2=max(ans2,min(f[i],f2[i]));
printf("%lld",maxu+ans2);
return 0;
}