rt,玄关。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=3e5+10,inf=1e18;
LL n,m,f[N],fa[N][21],ma[N][21],se[N][21],tot,dfn[N];
bool vis[N];
vector<PII> e[N];
struct edge { LL u,v,w; }p[N];
bool cmp(edge a,edge b) { return a.w<b.w; }
LL find(LL x) { return x==f[x]?x:f[x]=find(f[x]); }
void upd(LL &x,LL y,LL lim) { if(y<lim) x=max(x,y); }
void init(LL u,LL fat,LL d)
{
fa[u][0]=fat;
ma[u][0]=d;
se[u][0]=-inf;
dfn[u]=++tot;
for(int i=1;i<=20;i++)
{
fa[u][i]=fa[fa[u][i-1]][i-1];
ma[u][i]=max(ma[u][i-1],ma[fa[u][i-1]][i-1]);
upd(se[u][i],se[u][i-1],ma[u][i]);
upd(se[u][i],ma[u][i-1],ma[u][i]);
upd(se[u][i],ma[fa[u][i-1]][i-1],ma[u][i]);
upd(se[u][i],se[fa[u][i-1]][i-1],ma[u][i]);
}
for(auto i:e[u])
{
LL v=i.first,w=i.second;
if(v==fat) continue;
init(v,u,w);
}
}
LL LCA(LL u,LL v,LL w)
{
if(dfn[u]>dfn[v]) swap(u,v);
LL r1=-inf,r2=-inf,tmp;
for(int i=20;i>=0;i--)
{
if(dfn[u]<dfn[fa[v][i]])
{
tmp=r1;
r1=max(r1,ma[v][i]);
upd(r2,tmp,r1);
upd(r2,ma[v][i],r1);
upd(r2,se[v][i],r1);
v=fa[v][i];
}
}
if(dfn[v]>dfn[u])
{
tmp=r1;
r1=max(r1,ma[v][0]);
upd(r2,tmp,r1);
upd(r2,ma[v][0],r1);
upd(r2,se[v][0],r1);
v=fa[v][0];
}
for(int i=20;i>=0;i--)
{
if(dfn[fa[u][i]]>=dfn[v])
{
tmp=r1;
r1=max(r1,ma[u][i]);
upd(r2,tmp,r1);
upd(r2,ma[u][i],r1);
upd(r2,se[u][i],r1);
u=fa[u][i];
}
}
if(w==r1) return w-r2;
return w-r1;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)
{
LL u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
p[i]=(edge){u,v,w};
}
sort(p+1,p+m+1,cmp);
for(int i=1;i<=n;i++) f[i]=i;
LL res=0;
for(int i=1;i<=m;i++)
{
LL u=p[i].u,v=p[i].v,w=p[i].w,fx=find(u),fy=find(v);
if(fx!=fy)
{
f[fx]=fy;
res+=w;
e[u].push_back(make_pair(v,w));
e[v].push_back(make_pair(u,w));
vis[i]=1;
}
}
init(1,0,0);
LL ans=inf;
for(int i=1;i<=m;i++)
{
if(vis[i]) continue;
LL u=p[i].u,v=p[i].v,w=p[i].w;
if(u==v) continue;
ans=min(ans,res+LCA(u,v,w));
}
printf("%lld",ans);
return 0;
}