#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define ll unsigned long long
#define db double
#define MAX 0x7fffffff
#define INF 0X3fffffff
#define N 100001<<1
using namespace std;
inline unsigned long long read()
{
ll f=1,s=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*f;
}
map<ll,map<ll,ll> >M;
ll from[N],net[N],to[N],f[N][30],V[N];
ll maxx[N][30],minn[N][30];
ll n,m,tot,cnt,res,ans,last,cntt;
ll fa[N],dep[N],lg[N];
struct node {
ll y,x,v,use;
}edge[3*N];
void add(ll x,ll y,ll v){
to[++cnt]=y;
V[cnt]=v;
net[cnt]=from[x];
from[x]=cnt;
}
ll find(ll x){
if(fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
bool cmp(node a,node b){
return a.v<b.v;
}
void dfs(ll u,ll fa){
dep[u]=dep[fa]+1;f[u][0]=fa;
for(int i=1;i<=18;i++){
f[u][i]=f[f[u][i-1]][i-1];
maxx[u][i]=max(maxx[u][i-1],maxx[f[u][i-1]][i-1]);
minn[u][i]=max(minn[u][i-1],minn[f[u][i-1]][i-1]);
if(maxx[u][i-1]!=maxx[f[u][i-1]][i-1]) minn[u][i]=max(minn[u][i],min(maxx[u][i-1],maxx[f[u][i-1]][i-1]));
}
for(int i=from[u];i;i=net[i]){
if(to[i]!=fa){
maxx[to[i]][0]=V[i];
minn[to[i]][0]=-1000000;
dfs(to[i],u);
}
}
}
ll LCA(ll x,ll y){
if(dep[x]<dep[y])swap(x,y);
for(int i=18;i>=0;i--)
if(dep[f[x][i]]>=dep[y])
x=f[x][i];
if(x==y)return x;
for(int i=18;i>=0;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][0];
}
ll romax(ll x,ll y,ll d){
ll res=-1000000;
for(int i=18;i>=0;i--)
if(dep[f[x][i]]>=dep[y]){
if(d!=maxx[x][i]) res=max(res,maxx[x][i]);
else res=max(res,minn[x][i]);
x=f[x][i];
}
return res;
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++) fa[i]=i,lg[i]=lg[i>>1]+1;
for(int i=1;i<=m;i++){
ll x,y;
x=edge[i].x=read();y=edge[i].y=read();edge[i].v=read();
}
sort(edge+1,edge+m+1,cmp);
for(int i=1;1<=m;i++){
ll x=find(edge[i].x),y=find(edge[i].y);
if(x==y) continue;
add(edge[i].x,edge[i].y,edge[i].v),add(edge[i].y,edge[i].x,edge[i].v);
fa[x]=y;
++cntt;
ans+=edge[i].v;
edge[i].use=1;
if(cntt==n-1) break;
}
minn[1][0]=-0x7fff;
dep[1]=1;
dfs(1,0);
last=2e9+9;
for(int i=1;i<=m;i++){
if(edge[i].use) continue;
ll x=edge[i].x,y=edge[i].y,z=edge[i].v;
ll lca=LCA(x,y);
ll a=romax(x,lca,z);
ll b=romax(y,lca,z);
last=min(last,ans-max(a,b)+z);
//cout<<ans<<" "<<a<<" "<<b<<" "<<z<<endl;
}
cout<<last;
return 0;
}
样例输出10000013