#include<bits/stdc++.h>
using namespace std;
#define maxn 1000070
#define maxc 2000070
#define maxm 3000070
struct edge{
int nxt,to,val;
}e[maxc];
int h[maxn],cnt=0;
void add(int u,int v,int w)
{
e[++cnt].nxt=h[u];
e[cnt].to=v;
e[cnt].val=w;
h[u]=cnt;
}
struct edge1{
int u,v,w;
bool used;
}e1[maxm];
int n,m,fa[maxn];
long long ans0;
bool cmp(edge1 a,edge1 b)
{
return a.w<b.w;
}
int find(int x)
{
if(x!=fa[x])return fa[x]=find(fa[x]);
return x;
}int sum;
void kruskal()
{
sort(e1+1,e1+m+1,cmp);
for(int i=1;i<=m;i++)
{
int u=find(e1[i].u),v=find(e1[i].v);
if(u==v)continue;
ans0+=e1[i].w;
sum++;
add(e1[i].u,e1[i].v,e1[i].w);
add(e1[i].v,e1[i].u,e1[i].w);
e1[i].used=true;fa[v]=u;
if(sum==n-1)break;
}
}
int f[maxn][35],mx[maxn][35],mx2[maxn][35],dep[maxn];
void dfs(int u)
{
dep[u]=dep[f[u][0]]+1;
for(int i=1;i<=19;i++)
{
f[u][i]=f[f[u][i-1]][i-1];
if(mx[u][i-1]==mx[f[u][i-1]][i-1])
{
mx[u][i]=mx[u][i-1];
mx2[u][i]=max(mx2[f[u][i-1]][i-1],mx2[u][i-1]);
}
if(mx[u][i-1]>mx[f[u][i-1]][i-1])
{
mx[u][i]=mx[u][i-1];
mx2[u][i]=max(mx[f[u][i-1]][i-1],mx2[u][i-1]);
}
if(mx[f[u][i-1]][i-1]>mx[u][i-1])
{
mx[u][i]=mx[f[u][i-1]][i-1];
mx2[u][i]=max(mx[u][i-1],mx2[f[u][i-1]][i-1]);
}
}
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].to,w=e[i].val;
if(v==f[u][0])continue;
f[v][0]=u;mx[v][0]=w;dfs(v);
mx2[v][0]=-0x7f7f7f7f;
}
}
int lca(int u,int v)
{
if(dep[u]<dep[v])swap(u,v);
for(int i=19;i>=0;i--)
if(dep[u]-dep[v]>=(1<<i))
u=f[u][i];
if(u==v)return u;
for(int i=19;i>=0;i--)
if(f[u][i]!=f[v][i])
u=f[u][i],v=f[v][i];
return f[u][0];
}
long long cal(int u,int v,int w)
{
int l=lca(u,v);
int nmx=0,nmx2=0;
for(int i=19;i>=0;i--)
{
if(dep[f[u][i]]>=dep[l])
{
if(nmx==mx[u][i])nmx2=max(mx2[u][i],nmx2);
if(nmx>mx[u][i])nmx2=max(mx[u][i],nmx2);
if(nmx<mx[u][i])
{
nmx2=max(mx[u][i],nmx);nmx=mx[u][i];
}
u=f[u][i];
}
if(dep[f[v][i]]>=dep[l])
{
if(nmx==mx[v][i])nmx2=max(mx2[v][i],nmx2);
if(nmx>mx[v][i])nmx2=max(mx[v][i],nmx2);
if(nmx<mx[v][i])
{
nmx2=max(mx2[v][i],nmx);
nmx=mx[v][i];
}
v=f[v][i];
}
}
if(w!=nmx)return ans0-nmx+w;
if(nmx2)return ans0-nmx2+w;
return 0x7f7f7f7f7f7f7f7f;
}
int vis[300010],vis2[300010];
int main()
{
scanf("%d%d",&n,&m);
memset(mx,-0x7f7f7f7f,sizeof(mx));
memset(mx2,-0x7f7f7f7f,sizeof(mx2));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&e1[i].u,&e1[i].v,&e1[i].w);
if(e1[i].u==e1[i].v)
{
i--;
m--;
}
}
for(int i=1;i<=n;i++)fa[i]=i;
kruskal();
dfs(1);
long long ans=0x7f7f7f7f7f7f7f7f;
for(int i=1;i<=m;i++)
if(!e1[i].used)
ans=min(cal(e1[i].u,e1[i].v,e1[i].w),ans);
cout<<ans;
return 0;
}