#include<bits/stdc++.h>
#define P pair<int,int>
#define MP make_pair
#define F first
#define S second
#define int long long
using namespace std;
const int M=6e5+1,N=1e5+1,MAXN=1e18+7;
int n,m,fa[N],ans,lca[N][30],dis[N];
int fmaxx[N][30],smaxx[N][30];
bool min_tree[M];
vector<P> p[N];
struct edge{
int u,v,data;
bool operator < (const edge x)const{return data<x.data;}
}e[M];
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void KAL(){
sort(e+1,e+1+m);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int x=find(e[i].u),y=find(e[i].v);
if(x==y) continue;
ans+=e[i].data;
min_tree[i]=1;
fa[x]=y;
}
}
void dfs(int u){
for(P q:p[u]){
int v=q.F,data=q.S;
if(dis[v]) continue;
lca[v][0]=u;
fmaxx[v][0]=data;
dis[v]=dis[u]+1;
dfs(v);
}
}
void init_lca(){
int k=__lg(n);
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++){
lca[j][i]=lca[lca[j][i-1]][i-1];
fmaxx[j][i]=max(fmaxx[j][i-1],fmaxx[lca[j][i-1]][i-1]);
if(fmaxx[j][i]!=fmaxx[j][i-1]) smaxx[j][i]=max(fmaxx[j][i-1],smaxx[j][i]);
if(fmaxx[j][i]!=fmaxx[lca[j][i-1]][i-1]) smaxx[j][i]=max(fmaxx[lca[j][i-1]][i-1],smaxx[j][i]);
smaxx[j][i]=max(smaxx[j][i],smaxx[j][i-1]);
smaxx[j][i]=max(smaxx[j][i],smaxx[lca[j][i-1]][i-1]);
}
}
int LCA_C(int x,int y){
int k=__lg(n);
if(dis[x]>dis[y]) swap(x,y);
for(int i=k;i>=0;i--)
if(dis[lca[x][i]]>=dis[y]) x=lca[x][i];
if(x==y) return x;
for(int i=k;i>=0;i--)
if(lca[x][i]!=lca[y][i]&&lca[x][i]&&lca[y][i])
x=lca[x][i],y=lca[y][i];
return lca[x][0];
}
int check(int x,int LCA,int data){
if(x==LCA) return MAXN;
int k=__lg(n);
int first_max=-MAXN,second_max=-MAXN;
for(int i=k;i>=0;i--){
if(dis[lca[x][i]]<dis[LCA]) continue;
first_max=max(first_max,fmaxx[x][i]);
if(fmaxx[x][i]<first_max) second_max=max(second_max,fmaxx[x][i]);
second_max=max(second_max,smaxx[x][i]);
x=lca[x][i];
if(x==LCA) break;
}
if(first_max==data) return data-second_max;
else return data-first_max;
}
signed main(){
cin>>n>>m;
for(int i=1,x,y,z;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].data;
KAL();
for(int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v,data=e[i].data;
if(min_tree[i]){
p[u].push_back(MP(v,data));
p[v].push_back(MP(u,data));
}
}
dis[1]=1;
dfs(1);
init_lca();
int add_min=MAXN;
for(int i=1;i<=m;i++){
if(min_tree[i]) continue;
int u=e[i].u,v=e[i].v,data=e[i].data;
if(u==v) continue;
int LCA=LCA_C(u,v);
int p1=check(u,LCA,data),p2=check(v,LCA,data);
add_min=min(add_min,min(p1,p2));
}
cout<<ans+add_min<<'\n';
return 0;
}