#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+5,INF=12345678900000000;
int n,m,b[N],top[N],fa[N],size[N],son[N],head[N],cnt,idx,pre[N],d[N],id[N],x,y,z,a[N],tot,minn,ans=INF;
bool vis[N];
struct Tree{
int l,r,max1,max2;
}t[N<<2];
struct node{
int from,to,nex,v;
}e[N<<2],c[N];
void add(int x,int y,int z)
{
e[++cnt].to=y;
e[cnt].nex=head[x];
e[cnt].from=x;
e[cnt].v=z;
head[x]=cnt;
}
bool kru(node a,node b)
{
return a.v<b.v;
}
void dfs1(int x,int f,int dep)
{
d[x]=dep;
size[x]=1;
fa[x]=f;
int maxson=-1;
for(int i=head[x];i;i=e[i].nex)
{
int to=e[i].to;
if(to==f)continue;
b[to]=b[x]+e[i].v;
dfs1(to,x,dep+1);
size[x]+=size[to];
if(size[to]>maxson)
{
maxson=size[to];
son[x]=to;
}
}
}
void dfs2(int x,int tp)
{
top[x]=tp;
id[x]=++idx;
a[idx]=b[x]-b[fa[x]];
if(!son[x])return ;
dfs2(son[x],tp);
for(int i=head[x];i;i=e[i].nex)
{
int to=e[i].to;
if(to==son[x]||to==fa[x])continue;
dfs2(to,to);
}
}
bool cmp(int a,int b)
{
return a>b;
}
int get(int a,int b,int c,int d)
{
int f[5]={a,b,c,d};
sort(f,f+4,cmp);
for(int i=1;i<4;i++)
{
if(f[i]!=f[0])return f[i];
}
}
void up(int k)
{
t[k].max1=max(t[k<<1].max1,t[k<<1|1].max1);
t[k].max2=get(t[k<<1].max1,t[k<<1].max2,t[k<<1|1].max1,t[k<<1|1].max2);
}
void build(int k,int l,int r)
{
t[k].l=l,t[k].r=r;
if(l==r)
{
t[k].max1=a[l];
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
up(k);
}
Tree query(int k,int x,int y)
{
if(t[k].l>=x&&t[k].r<=y)
{
return t[k];
}
int mid=(t[k].l+t[k].r)>>1;
if(y<=mid)return query(k<<1,x,y);
else
{
if(x>mid)return query(k<<1|1,x,y);
else
{
Tree ans,t1,t2;
t1=query(k<<1,x,y),t2=query(k<<1|1,x,y);
ans.max1=max(t1.max1,t2.max1);
ans.max2=get(t1.max1,t1.max2,t2.max1,t2.max2);
return ans;
}
}
}
int lca(int x,int y,int w)
{
int res=-INF;
while(top[x]!=top[y])
{
// printf("NMSLNSMLNSM\n");
if(d[top[x]]<d[top[y]])swap(x,y);
Tree tmp=query(1,id[top[x]],id[x]);
res=max(res,(tmp.max1==w)?tmp.max2:tmp.max1);
x=fa[top[x]];
}
if(d[x]>d[y])swap(x,y);
Tree tmp=query(1,id[x],id[y]);
res=max(res,(tmp.max1==w)?tmp.max2:tmp.max1);
return res;
}
int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
int find(int x)
{
if(pre[x]==x)return x;
return pre[x]=find(pre[x]);
}
signed main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)pre[i]=i;
for(int i=1;i<=m;i++)
{
c[i].from=read(),c[i].to=read(),c[i].v=read();
}
sort(c+1,c+m+1,kru);
int k=0;
for(int i=1;i<=m;i++)
{
int fax=find(c[i].from),fay=find(c[i].to);
if(fax!=fay)
{
pre[fax]=fay;
k++;
add(c[i].from,c[i].to,c[i].v);
add(c[i].to,c[i].from,c[i].v);
//printf("%lld %lld\n",c[i].from,c[i].to);
minn+=c[i].v;
vis[i]=true;
}
if(k==n-1)break;
}
// printf("%lld\n",minn);
dfs1(1,0,1);
dfs2(1,1);
build(1,1,idx);
for(int i=1;i<=m;i++)
{
if(vis[i])continue;
int res=minn+c[i].v-lca(c[i].from,c[i].to,c[i].v);
// printf("res=%lld\n",res);
if(res>minn&&res<ans&&res!=minn+e[i].v)
ans=res;
}
printf("%lld",ans);
}