rt,求条
#include <iostream>
#include <cstdio>
#include <algorithm>
#define fo(i,l,r) for(int i=(l);i<=(r);++i)
#define of(i,l,r) for(int i=(l);i>=(r);--i)
#define fin(f) freopen(f,"r",stdin)
#define fout(f) freopen(f,"w",stdout)
#define debug(...) cout<<__VA_ARGS__<<'\n'
#define fdbg(...) cout<<__VA_ARGS__<<' '
#define endl '\n'
using namespace std;
typedef long long ll;
constexpr int inf=0x3f3f3f3f;
constexpr ll INF=0x7fffffff;
constexpr int N=1e5+5;
constexpr int M=3e5+5;
struct Ed {int x,y,w;}ed[M];
struct Edge {int to,nxt,val;}e[M<<1];
int head[N],tot,n,m;
void add(int u,int v,int w) {
e[++tot].to=v;
e[tot].nxt=head[u];
e[tot].val=w;
head[u]=tot;
}
int fat[N];ll mst;bool fl[M];
int find(int x) {return x==fat[x]?x:find(fat[x]);}
void kru() {
fo(i,1,n) fat[i]=i;
sort(ed+1,ed+m+1,[](Ed x,Ed y){return x.w<y.w;});
int cnt=0;
fo(i,1,m) {
int x=ed[i].x,y=ed[i].y,w=ed[i].w;
int fx=find(x),fy=find(y);if(fx==fy) continue;
fat[fx]=fy;
cnt++;
mst+=w;
fl[i]=1;
add(x,y,w);add(y,x,w);
if(cnt==n-1) break;
}
}
int lg[N],dep[N],fa[N][20],mx1[N][20],mx2[N][20];
void dfs(int u,int f,int w) {
dep[u]=dep[f]+1;fa[u][0]=f;
mx1[u][0]=w;mx2[u][0]=-inf;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].to;if(v==f) continue;
dfs(v,u,e[i].val);
}
}
void dp() {
lg[1]=0;fo(i,2,n) lg[i]=lg[i>>1]+1;
fo(k,1,lg[n]) fo(i,1,n) {
fa[i][k]=fa[fa[i][k-1]][k-1];
mx1[i][k]=max(mx1[i][k-1],mx1[fa[i][k-1]][k-1]);
mx2[i][k]=max(mx2[i][k-1],mx2[fa[i][k-1]][k-1]);
if(mx1[i][k-1]<mx1[fa[i][k-1]][k-1]) mx2[i][k]=max(mx2[i][k],mx1[i][k-1]);
if(mx1[i][k-1]>mx1[fa[i][k-1]][k-1]) mx2[i][k]=max(mx2[i][k],mx1[fa[i][k-1]][k-1]);
}
}
int lca(int u,int v) {
if(dep[u]<dep[v]) swap(u,v);
of(k,lg[n],0) if(dep[fa[u][k]]>=dep[v]) u=fa[u][k];
if(u==v) return u;
of(k,lg[n],0) if(fa[u][k]!=fa[v][k]) u=fa[u][k],v=fa[v][k];
return fa[u][0];
}
ll query(int u,int v,int mx) {
ll res=-INF;
of(k,lg[n],0) if(dep[fa[u][k]]>=dep[v]) {
if(mx1[u][k]!=mx) res=max(res,1ll*mx1[u][k]);
else res=max(res,1ll*mx2[u][k]);
u=fa[u][k];
}
return res;
}
int main() {
ios::sync_with_stdio(0);cin.tie(nullptr);
cin>>n>>m;
fo(i,1,m) cin>>ed[i].x>>ed[i].y>>ed[i].w;
kru();
dfs(1,0,0);dp();
ll ans=INF;
fo(i,1,m) {
if(fl[i]) continue;
int x=ed[i].x,y=ed[i].y,w=ed[i].w;
int l=lca(x,y);
ll mx=max(query(x,l,w),query(y,l,w));
ans=min(ans,mst+w-mx);
}
cout<<ans<<endl;
return 0;
}