WA了两个点
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define M 2000010
#define N 1000010
#define ll long long
using namespace std;
inline void read(int &x){
x=0;int f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
x*=f;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
struct edge{
int x,y,z;
}E[M];
struct edgee{
int to,next,val;
}e[M];
int tot=0,m,n,minn=INF;
ll ans=0;
int f[N][25],max1[N][25],max2[N][25],fa[N],head[N],dep[N],vis[N];
bool cmp(edge a,edge b){
return a.z<b.z;
}
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void add(int u,int v,int w){
e[++tot].to=v;
e[tot].next=head[u];
e[tot].val=w;
head[u]=tot;
}
void kruscal(){
int num=0;
sort(E+1,E+m+1,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int x=find(E[i].x);
int y=find(E[i].y);
if(x!=y){
ans+=E[i].z;
vis[i]=1;
num++;
fa[y]=x;
add(E[i].x,E[i].y,E[i].z);
add(E[i].y,E[i].x,E[i].z);
}
if(num==n-1) break;
}
}
void dfs(int x){
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(v==f[x][0]) continue;
f[v][0]=x;
max1[v][0]=e[i].val;
dep[v]=dep[x]+1;
for(int j=1;j<=20;j++){
if(dep[v]<(1<<j)) break;
f[v][j]=f[f[v][j-1]][j-1];
max1[v][j]=max(max1[v][j-1],max1[f[v][j-1]][j-1]);
if(max1[v][j-1]==max1[f[v][j-1]][j-1])
max2[v][j]=max(max2[v][j-1],max2[f[v][j-1]][j-1]);
else{
max2[v][j]=min(max1[v][j-1],max1[f[v][j-1]][j-1]);
max2[v][j]=max(max2[v][j],max2[f[v][j-1]][j-1]);
max2[v][j]=max(max2[v][j-1],max2[v][j]);
}
}
dfs(v);
}
}
int LCA(int a,int b)
{
if(dep[a]>dep[b])swap(a,b);
for(int i=20;i>=0;i--)if(dep[f[b][i]]>=dep[a])b=f[b][i];
if(a==b) return a;
for(int i=20;i>=0;i--)if(f[a][i]!=f[b][i])a=f[a][i],b=f[b][i];
return f[a][0];
}
void change(int x,int lca,int val){
int val1=0,val2=0;
for(int i=0;i<=20;i++){
if(dep[x]-dep[lca]<(1<<i)) break;
if(dep[x]-dep[lca]&(1<<i)){
if(max1[x][i]>val1){
val2=max(val1,max2[x][i]);
val1=max1[x][i];
}
x=f[x][i];
}
}
if(val!=val1) minn=min(minn,val-val1);
else minn=min(minn,val-val2);
}
int main(){
read(n);read(m);
for(int i=1;i<=m;i++){
read(E[i].x);read(E[i].y);read(E[i].z);
}
kruscal();
dfs(1);
for(int i=1;i<=m;i++){
if(!vis[i]){
int x=E[i].x,y=E[i].y;
int lca=LCA(x,y);
change(x,lca,E[i].z);change(y,lca,E[i].z);
}
}
write(ans+minn);putchar('\n');
}