I don't now why I can't type Chinese on this computer.But please help me.
#include<bits/stdc++.h>
using namespace std;
struct nd {
int u,v,w;
} a[300001];
struct nd2 {
int v,w;
};
bool cmp(nd op1,nd op2) {
return op1.w<op2.w;
}
int n,m;
long long sum,ans=LLONG_MAX;
int fa[100001],flag[100001],dep[100001],f[100001][22],g[100001][22],h[100001][22];
vector<nd2> tr[100001];
int fd(int x) {
return fa[x]==x?x:fa[x]=fd(fa[x]);
}
void read() {
int M;
cin>>n>>M;
m=0;
for(int i=1; i<=M; ++i) {
int u,v,w;
cin>>u>>v>>w;
if(u!=v)m++,a[m].u=u,a[m].v=v,a[m].w=w;
}
}
void dfs(int u,int dad,int w) {
dep[u]=dep[dad]+1;
f[u][0]=dad,g[u][0]=w,h[u][0]=-1e9;
for(int i=1; i<=20; ++i) {
f[u][i]=f[f[u][i-1]][i-1];
g[u][i]=max(g[u][i-1],g[f[u][i-1]][i-1]);
h[u][i]=max(h[u][i-1],h[f[u][i-1]][i-1]);
if(g[u][i-1]<g[f[u][i-1]][i-1])h[u][i]=max(h[u][i],g[u][i-1]);
else if(g[u][i-1]>g[f[u][i-1]][i-1])h[u][i]=max(h[u][i],g[f[u][i-1]][i-1]);
}
for(int i=0; i<tr[u].size(); ++i) {
if(tr[u][i].v==dad)continue;
dfs(tr[u][i].v,u,tr[u][i].w);
}
}
void kruskal() {
sort(a+1,a+m+1,cmp);
for(int i=1; i<=n; ++i)fa[i]=i;
int res=0;
for(int i=1; i<=m; ++i) {
if(fd(a[i].u)!=fd(a[i].v)) {
flag[i]=1;
res++;
sum+=a[i].w;
fa[fd(a[i].u)]=fd(a[i].v);
tr[a[i].u].push_back({a[i].v,a[i].w});
tr[a[i].v].push_back({a[i].u,a[i].w});
}
if(res==n-1)break;
}
}
int lca(int x,int y) {
if(dep[x]<dep[y])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];
}
long long mx(int u,int v,int maxn) {
long long ret=-1e9;
for(int i=18; i>=0; --i) {
if(dep[f[u][i]]>=dep[v])
{
if(g[u][i]==maxn)ret=max(ret,(long long)h[u][i]);
else ret=max(ret,(long long)g[u][i]);
u=f[u][i];
}
}
return ret;
}
void calc() {
for(int i=1; i<=m; ++i) {
if(flag[i])continue;
int w=a[i].w,u=a[i].u,v=a[i].v,p=lca(u,v);
long long max1=mx(u,p,w),max2=mx(v,p,w);
ans=min(ans,sum-max(max1,max2)+w);
}
}
int main() {
read();
kruskal();
dfs(1,0,0);
calc();
cout<<ans;
}
thanks so much