#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
#define CCF 0
#define FUCK return
struct ba
{
int from;
int to;
int nex;
int lon;
bool use;
}bian[100001];
int f[100001][21]={};
int fa[100001]={};
int g[100001][21][2]={};
struct hd
{
int fir;
int las;
int num;
}head[100001];
bool bmp(ba a,ba b)
{
return a.lon<b.lon;
}
int p=0;
void lian(int a,int b,int c)
{
p++;
if(head[a].num)
{
bian[head[a].las].nex=p;
head[a].num++;
head[a].las=p;
}
else
{
head[a].fir=p;
head[a].las=p;
head[a].num=1;
}
}
int fin(int x)
{
if(fa[x]==x)
return x;
return fa[x]=fin(fa[x]);
}
int dep[100001]={};
void dfs(int a,int fat)
{
fa[a]=fat;
dep[a]=dep[fat]+1;
for(int i=head[a].fir;i;i=bian[i].nex)
{
if(bian[i].to!=fat&&bian[i].use==1)
{
dfs(bian[i].to,a);
g[a][0][0]=bian[i].lon;
}
}
return;
}
void zuida(int a,int b,int &ans1,int &ans2)
{
if(dep[a]<dep[b])
swap(a,b);
for(int i=20;i>=0;i--)
{
if(a==b)
return;
if(dep[a]==dep[b])
break;
if(dep[f[a][i]]>=dep[b])
{
ans1=max(g[a][i][0],ans1);
ans2=max(g[a][i][1],ans2);
a=f[a][i];
}
}
for(int i=20;i>=0;i--)
{
if(a==b)
return;
if(f[a][i]!=f[b][i])
{
ans1=max(g[a][i][0],ans1);
ans1=max(g[b][i][0],ans1);
ans2=max(g[a][i][1],ans2);
ans2=max(g[b][i][1],ans2);
a=f[a][i];
b=f[b][i];
}
}
ans1=max(g[a][0][0],ans1);
ans1=max(g[b][0][0],ans1);
ans2=max(g[a][0][1],ans2);
ans2=max(g[b][0][1],ans2);
}
#undef int
int main()
{
#define int long long
int n,m;
scanf("%lld %lld",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%lld %lld %lld",&a,&b,&c);
bian[(i<<1)-1].from=a;
bian[(i<<1)-1].to=b;
bian[(i<<1)-1].lon=c;
bian[(i<<1)].from=b;
bian[i<<1].to=a;
bian[i<<1].lon=c;
}
sort(bian+1,bian+1+m+m,bmp);
for(int i=1;i<=m;i++)
{
lian(bian[i<<1-1].from,bian[i<<1-1].to,bian[i<<1-1].lon);
lian(bian[i<<1].from,bian[i<<1].to,bian[i<<1].lon);
}
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
int temp=0;
int ans=0;
for(int i=1;i<=m&&temp<=n-1;i++)
{
if(fin(bian[i<<1].from)!=fin(bian[i<<1].to))
{
temp++;
ans+=bian[i<<1].lon;
fa[fin(bian[i<<1].to)]=bian[i<<1].from;
bian[i<<1].use=bian[(i<<1)-1].use=1;
}
}
dfs(1,0);
int ans2=21000000000000000;
for(int i=1;i<=n;i++)
{
f[i][0]=fa[i];
g[i][0][1]=-100000000000;
}
for(int i=1;i<=20;i++)
{
for(int j=1;j<=n;j++)
{
f[j][i]=f[f[j][i-1]][i-1];
g[j][i][0]=max(g[j][i-1][0],g[f[j][i-1]][i-1][0]);
if(g[j][i-1][0]==g[f[j][i-1]][i-1][0])
g[i][j][1]=max(g[i][j-1][1],g[f[i][j-1]][j-1][1]);
if(g[j][i-1][0]<g[f[j][i-1]][i-1][0])
g[i][j][1]=max(g[i][j-1][0],g[f[i][j-1]][j-1][1]);
if(g[j][i-1][0]>g[f[j][i-1]][i-1][0])
g[i][j][1]=max(g[i][j-1][1],g[f[i][j-1]][j-1][0]);
}
}
for(int i=1;i<=m;i++)
{
if(!bian[i<<2].use)
{
int ansss;
int anssss;
zuida(bian[i<<2].from,bian[i<<2].to,ansss,anssss);
if(ansss==bian[i<<2].lon)
{
ans2=min(ans2,ans+bian[i<<2].lon-anssss);
}
else
{
ans2=min(ans2,ans+bian[i<<2].lon-ansss);
}
}
}
printf("%lld",ans2);
FUCK CCF;
}