#include<bits/stdc++.h>
using namespace std;
struct e{
int from,to,w;
}edge[300005];
bool used[300005];
struct node{
int to,w;
};
struct kkksc03{
int m,s;
};
int n,m,fa[100005],mst;
vector<node>tree[100005];
int pre[100005][25],depth[100005],maxn[100005][25],secn[100005][25],ans=2147483647;
int find(int op){
if(fa[op]==op)return op;
return fa[op]=find(fa[op]);
}
bool cmp(e a,e b){
return a.w<b.w;
}
void dfs(int op,int pa){
pre[op][0]=pa;
depth[op]=depth[pa]+1;
for(int i=1;i<=20;i++){
pre[op][i]=pre[pre[op][i-1]][i-1];
maxn[op][i]=max(maxn[op][i-1],maxn[pre[op][i-1]][i-1]);
if(maxn[op][i-1]!=maxn[pre[op][i-1]][i-1])secn[op][i]=max(max(secn[op][i-1],secn[pre[op][i-1]][i-1]),min(maxn[op][i-1],maxn[pre[op][i-1]][i-1]));
else secn[op][i]=max(secn[op][i-1],secn[pre[op][i-1]][i-1]);
}
}
kkksc03 lca(int a,int b){
kkksc03 l;
if(depth[a]<depth[b]){
int c=a;
a=b;
b=c;
}
for(int i=20;i>=0;i--){
if(depth[pre[a][i]]>=depth[b]){
a=pre[a][i];
l.m=max(l.m,maxn[a][i]);
l.s=max(l.s,secn[a][i]);
}
}
if(a==b)return l;
for(int i=20;i>=0;i--){
if(pre[a][i]!=pre[b][i]){
l.m=max(l.m,maxn[a][i]);
l.m=max(l.m,maxn[b][i]);
l.s=max(l.s,secn[a][i]);
l.s=max(l.s,secn[b][i]);
a=pre[a][i];
b=pre[b][i];
}
}
return l;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++){
cin>>edge[i].from>>edge[i].to>>edge[i].w;
}
sort(edge+1,edge+1+m,cmp);
for(int i=1;i<=m;i++){
if(find(edge[i].from)!=find(edge[i].to)){
mst+=edge[i].w;
used[i]=true;
fa[find(edge[i].from)]=find(edge[i].to);
tree[edge[i].from].push_back(node{edge[i].to,edge[i].w});
tree[edge[i].to].push_back(node{edge[i].from,edge[i].w});
}
}
dfs(1,0);
for(int i=1;i<=m;i++){
if(used[i])continue;
kkksc03 temp=lca(edge[i].from,edge[i].to);
if(edge[i].w>temp.m)ans=min(ans,mst+edge[i].w-temp.m);
else ans=min(ans,mst+edge[i].w-temp.s);
}
cout<<ans;
return 0;
}
马蜂可能不是很良好,样例过了,但全wa,还有负的输出。。。开longlong样例过不了。。。玄学。。。