#include<bits/stdc++.h>
using namespace std;
#define int long long
#define minn(a,b) a<b?a:b
#define maxx(a,b) a>b?a:b
const int N=100010,M=300010,K=21;
int n,m,fa[N],tot,vis[M],mn,ans,dep[N],dp[N][K],mx1[N][K],mx2[N][K];
struct node{
int u,v,w,id;
}a[M],b[N];
struct pos{
int to,w;
};
vector<pos>ve[N];
bool cmp(node x,node y){
return x.w<y.w;
}
void init(){
for(int i=1;i<=n;i++) fa[i]=i;
return;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void kruskal(){
init();
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++){
int fu=find(a[i].u),fv=find(a[i].v);
if(fu==fv) continue;
fa[fv]=fu;
vis[a[i].id]=1;
b[++tot]=a[i];
ans+=a[i].w;
}
return;
}
void pre_dfs(int now,int fa,int val){
dep[now]=dep[fa]+1;
dp[now][0]=fa;
mx1[now][0]=val;
for(int i=1;i<=20;i++){
dp[now][i]=dp[dp[now][i-1]][i-1];
mx1[now][i]=maxx(mx1[now][i-1],mx1[dp[now][i-1]][i-1]);
if(mx1[now][i-1]!=mx1[dp[now][i-1]][i-1]) mx2[now][i]=minn(mx1[now][i-1],mx1[dp[now][i-1]][i-1]);
mx2[now][i]=maxx(mx2[now][i],maxx(mx2[now][i-1],mx2[dp[now][i-1]][i-1]));
}
for(int i=0;i<ve[now].size();i++){
int tmp1=ve[now][i].to,tmp2=ve[now][i].w;
if(tmp1!=fa){
pre_dfs(tmp1,now,tmp2);
}
}
return;
}
void find_mx(int &ans1,int &ans2,int i,int j){
if(mx1[i][j]>ans1){
ans1=mx1[i][j];
if(mx2[i][j]>ans2){
ans2=mx2[i][j];
}
}
else{
if(mx1[i][j]>ans2){
ans2=mx1[i][j];
}
else{
if(mx2[i][j]>ans2){
ans2=mx2[i][j];
}
}
}
return;
}
int lca(int x,int y,int z){
int tmp1=-1,tmp2=-1;
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--){
if(dep[dp[x][i]]>=dep[y]){
find_mx(tmp1,tmp2,x,i);
x=dp[x][i];
}
}
if(x==y){
if(tmp1<z && tmp1!=-1) return z-tmp1;
else if(tmp2<z && tmp2!=-1) return z-tmp2;
else return -1;
}
for(int i=20;i>=0;i--){
if(dp[x][i]!=dp[y][i]){
find_mx(tmp1,tmp2,x,i);
find_mx(tmp1,tmp2,y,i);
x=dp[x][i];
y=dp[y][i];
}
}
find_mx(tmp1,tmp2,x,0);
find_mx(tmp1,tmp2,y,0);
if(tmp1<z && tmp1!=-1) return z-tmp1;
else if(tmp2<z && tmp2!=-1) return z-tmp2;
else return -1;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i].u>>a[i].v>>a[i].w;
a[i].id=i;
}
kruskal();
for(int i=1;i<=tot;i++){
ve[b[i].u].push_back({b[i].v,b[i].w});
ve[b[i].v].push_back({b[i].u,b[i].w});
}
pre_dfs(1,0,0);
mn=LONG_LONG_MAX;
for(int i=1;i<=m;i++){
if(!vis[a[i].id]){
int tmp=lca(a[i].u,a[i].v,a[i].w);
if(tmp!=-1){
mn=minn(mn,tmp);
}
}
}
cout<<ans+mn;
return 0;
}