#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+25;
int n,m,tot=1,frt[N],dep[N],a,b,pre1[N],pre2[N],root;
ll ans,d1[N],d2[N],dis[N][2];
bool vis[N];
struct node{
int nxt,to,t;
}e[N<<1];
inline void add(int u,int v,int t){
e[++tot].nxt=frt[u],frt[u]=tot,e[tot].to=v,e[tot].t=t;
e[++tot].nxt=frt[v],frt[v]=tot,e[tot].to=u,e[tot].t=t;
}
void dp(int x){
vis[x]=1;
for(int i=frt[x];i;i=e[i].nxt){
int y=e[i].to;
if(vis[y])
continue;
dp(y);
if(d1[y]+e[i].t>=d1[x])
d2[x]=d1[x],d1[x]=d1[y]+e[i].t,pre2[x]=pre1[x],pre1[x]=y;
else
if(d2[x]<=d1[y]+e[i].t)
d2[x]=d1[y]+e[i].t,pre2[x]=y;
}
}
inline void bfs(int x,int tag){
memset(vis,0,sizeof(vis));
queue<int> q;
vis[x]=1,q.push(x);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=frt[u];i;i=e[i].nxt){
int v=e[i].to;
if(!vis[v]){
dis[v][tag]=dis[u][tag]+e[i].t;
vis[v]=1;
q.push(v);
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
int u,v,t;
while(m--){
scanf("%d%d%d",&u,&v,&t);
add(u,v,t);
}
dp(1);
for(int i=1;i<=n;i++)
if(d1[i]+d2[i]>=ans)
ans=d1[i]+d2[i],root=i;
for(int i=root;i;i=pre1[i])
a=i;
for(int i=root;i;i=pre2[i])
b=i;
bfs(a,0);
bfs(b,1);
ll len=0;
for(int i=1;i<=n;i++)
len=max(len,min(dis[i][0],dis[i][1]));
printf("%lld",ans+len);
return 0;
}