#include<bits/stdc++.h>
#define INF 2147483647
using namespace std;
struct node
{
long long u,v,w,next;
}edge[600005],e[600005];
long long n,m,num=0,sum=0,head[100005],fa[100005],bz[100005][20],dep[100005],f_max[100005][20],s_max[100005][20],deep[100005];
int flag[300005];
bool comp(node a,node b)
{
return a.w<b.w;
}
long long getfa(int t)
{
if (fa[t]!=t) return fa[t]=getfa(fa[t]);
return fa[t];
}
void add(long long from,long long to,long long cost)
{
++num;
e[num].u=from;
e[num].v=to;
e[num].w=cost;
e[num].next=head[from];
head[from]=num;
}
void dfs(long long t,long long f)
{
bz[t][0]=f;
for (int i=head[t];i!=0;i=e[i].next)
{
if (e[i].v==f) continue;
dep[e[i].v]=dep[t]+1;
f_max[e[i].v][0]=e[i].w;
s_max[e[i].v][0]=-INF;
dfs(e[i].v,t);
}
}
void work()
{
for (int i=1;i<=19;++i)
for (int j=1;j<=n;++j)
{
bz[j][i]=bz[bz[j][i-1]][i-1];
f_max[j][i]=max(f_max[j][i-1],f_max[bz[j][i-1]][i-1]);
s_max[j][i]=max(s_max[j][i-1],s_max[bz[j][i-1]][i-1]);
if (f_max[j][i-1]>f_max[bz[j][i-1]][i-1]) s_max[j][i]=max(s_max[j][i],f_max[bz[j][i-1]][i-1]);
else if (f_max[j][i-1]<f_max[bz[j][i-1]][i-1]) s_max[j][i]=max(s_max[j][i],f_max[j][i-1]);
}
}
long long lca(long long x,long long y)
{
if (dep[x]<dep[y]) swap(x,y);
for (int i=19;i>=0;--i)
if (deep[bz[x][i]]>=deep[y]) x=bz[x][i];
if (x==y) return x;
for (int i=19;i>=0;--i)
if (bz[x][i]!=bz[y][i])
{
x=bz[x][i];
y=bz[y][i];
}
return bz[x][0];
}
int checkmax(int u,int v,int maxn)
{
long long a=-INF;
for (int i=19;i>=0;--i)
if (dep[bz[u][i]]>=dep[v])
{
if (maxn!=f_max[u][i]) a=max(a,f_max[u][i]);
else a=max(a,s_max[u][i]);
u=bz[u][i];
}
return a;
}
int main()
{
cin>>n>>m;
for (int i=1;i<=m;++i) cin>>edge[i].u>>edge[i].v>>edge[i].w;
for (int i=1;i<=n;++i) fa[i]=i;
sort(edge+1,edge+m+1,comp);
for (int i=1;i<=m;++i)
{
int fx=getfa(edge[i].u),fy=getfa(edge[i].v);
if (fx!=fy)
{
sum+=edge[i].w;
fa[fy]=fx;
add(edge[i].u,edge[i].v,edge[i].w);
add(edge[i].v,edge[i].u,edge[i].w);
flag[i]=1;
}
}
s_max[1][0]=-INF;
deep[1]=1;
dfs(1,0);
work();
long long ans=INF;
for (int i=1;i<=m;++i)
if (flag[i]==0)
{
int bothroot=lca(edge[i].u,edge[i].v);
int lmax=checkmax(edge[i].u,bothroot,edge[i].w),rmax=checkmax(edge[i].v,bothroot,edge[i].w);
ans=min(ans,sum-max(lmax,rmax)+edge[i].w);
}
cout<<ans;
return 0;
}
W4,W8,W10