#include <cstdio>
#include <algorithm>
#include <cstring>
typedef long long ll;
#define int long long
const int N=1e5+5;
const int M=3e5+5;
const int INF=1e15;
struct edge {
int u,v,w;
bool is;
}e[M<<1];
int tot;
bool cmp(edge x,edge y) {
return x.w<y.w;
}
struct node {
int v,w;
int next;
}G[M<<1];
int h[N],idx;
void add(int u,int v,int w) {
G[++idx].v=v;G[idx].w=w;
G[idx].next=h[u];h[u]=idx;
}
int n,m;
int fa[N];
void init() {
for(int i=1;i<=n;i++) fa[i]=i;
}
int Find(int x) {
if(fa[x]==x) return fa[x];
return fa[x]=Find(fa[x]);
}
ll MST;
void kruscal() {
int cnt=0;
std::sort(e+1,e+m+1,cmp);
init();
for(int i=1;i<=m;i++) {
if(cnt==n-1) return;
int x=e[i].u,y=e[i].v;
if(x==y) continue;
if(Find(x)!=Find(y)) {
fa[Find(x)]=Find(y);
MST+=e[i].w;cnt++;
e[i].is=true;
add(x,y,e[i].w);add(y,x,e[i].w);
}
}
}
int f[N][25],maxn[N][25][2],dep[N];
void dfs(int x,int fath) {
dep[x]=dep[fath]+1;
f[x][0]=fath;
for(int k=1;k<=20;k++) {
if(dep[x]<(1<<k)) break;
f[x][k]=f[f[x][k-1]][k-1];
maxn[x][k][0]=std::max(maxn[x][k-1][0],maxn[f[x][k-1]][k-1][0]);
if(maxn[x][k-1][0]==maxn[f[x][k-1]][k-1][0]) {
maxn[x][k][1]=std::max(maxn[x][k-1][1],maxn[f[x][k-1]][k-1][1]);
} else if(maxn[x][k-1][0]<maxn[f[x][k-1]][k-1][0]) {
maxn[x][k][1]=std::max(maxn[x][k-1][0],maxn[f[x][k-1]][k-1][1]);
} else {
maxn[x][k][1]=std::max(maxn[x][k-1][1],maxn[f[x][k-1]][k-1][0]);
}
}
for(int i=h[x];i;i=G[i].next) {
int j=G[i].v;
if(j==fath) continue;
maxn[j][0][0]=G[i].w;
maxn[j][0][1]=-INF;
dfs(j,x);
}
}
int LCA(int x,int y) {
if(dep[x]<dep[y]) std::swap(x,y);
for(int i=20;i>=0;i--) {
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
}
if(x==y) return x;
for(int i=20;i>=0;i--) {
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
}
return f[x][0];
}
ll ans=INF;
void minn_MST(int x,int y,int w) {
int lca=LCA(x,y);
int maxn1=0,maxn2=0;
for(int i=0;i<=20;i++) {
if(dep[f[x][i]]>=dep[lca]) {
if(maxn[x][i][0]==w) maxn1=std::max(maxn1,maxn[x][i][1]);
else maxn1=std::max(maxn1,maxn[x][i][0]);
x=f[x][i];
} else {
break;
}
}
ll sum=MST;
sum=MST+w-maxn1;
ans=std::min(ans,sum);
maxn1=0;
for(int i=0;i<=20;i++) {
if(dep[f[y][i]]>=dep[lca]) {
if(maxn[y][i][0]==w) maxn1=std::max(maxn1,maxn[y][i][1]);
else maxn1=std::max(maxn1,maxn[y][i][0]);
y=f[y][i];
} else {
break;
}
}
sum=MST+w-maxn1;
ans=std::min(ans,sum);
}
signed main() {
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&e[i].u,&e[i].v,&e[i].w);
kruscal();
dep[1]=1;
maxn[1][0][1]=-INF;
dfs(1,0);
for(int i=1;i<=m;i++) {
if(!e[i].is) {
if(e[i].u==e[i].v) continue;
minn_MST(e[i].u,e[i].v,e[i].w);
}
}
printf("%lld\n",ans);
return 0;
}
感觉可能是 minn_MST 函数有点问题,但调了一下午没调出来。