#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
struct node{
int u;
int v;
int w;
};
node p[300005];
bool cmp(node x,node y){
return x.w<y.w;
}
int f[100005];
int ff(int x){
if(f[x]==x) return x;
f[x]=ff(f[x]);
return f[x];
}
bool fnd(int x,int y){
return ff(x)==ff(y);
}
void merge(int x,int y){
if(!fnd(x,y)) f[ff(x)]=ff(y);
return;
}
struct edge{
int nxt;
int to;
int w;
bool tr;
};
edge e[200005];
int h[100005];
int cnt;
void add(int x,int y,int z,bool flag){
cnt++;
e[cnt].nxt=h[x];
h[x]=cnt;
e[cnt].to=y;
e[cnt].tr=flag;
e[cnt].w=z;
return;
}
long long aans;
void k(){
for(int i=1;i<=m;i++){
if(!fnd(p[i].u,p[i].v)){
merge(p[i].u,p[i].v);
add(p[i].u,p[i].v,p[i].w,1);
add(p[i].v,p[i].u,p[i].w,1);
aans+=p[i].w;
}
else{
add(p[i].u,p[i].v,p[i].w,0);
add(p[i].v,p[i].u,p[i].w,0);
}
}
return;
}
int fat[20][100005];
int g1[20][100005];
int g2[20][100005];
int dep[100005];
void dfs(int x,int fa){
fat[0][x]=fa;
dep[x]=dep[fa]+1;
for(int i=h[x];i;i=e[i].nxt){
if(!e[i].tr) continue;
if(e[i].to!=fa) dfs(e[i].to,x);
else{
g1[0][x]=e[i].w;
}
}
return;
}
int mx1,mx2;
void lca(int x,int y){
mx1=0,mx2=0;
if(dep[x]<dep[y]) swap(x,y);
if(dep[x]>dep[y])
for(int i=19;i>=0;i--)
if(dep[fat[i][x]]>=dep[y]){
if(!mx1&&!mx2){
mx1=g1[i][x];
mx2=g2[i][x];
}
else{
if(g1[i][x]>mx1){
mx2=mx1;
mx1=g1[i][x];
}
else if(g1[i][x]>mx2)
if(mx1!=g1[i][x]) mx2=g1[i][x];
if(g2[i][x]>mx1){
mx2=mx1;
mx1=g2[i][x];
}
else if(g2[i][x]>mx2)
if(mx1!=g2[i][x]) mx2=g2[i][x];
}
x=fat[i][x];
}
for(int i=19;i>=0;i--){
if(fat[i][x]!=fat[i][y]){
if(!mx1&&!mx2){
mx1=g1[i][x];
mx2=g2[i][x];
}
else{
if(g1[i][x]>mx1){
mx2=mx1;
mx1=g1[i][x];
}
else if(g1[i][x]>mx2)
if(mx1!=g1[i][x]) mx2=g1[i][x];
if(g2[i][x]>mx1){
mx2=mx1;
mx1=g2[i][x];
}
else if(g2[i][x]>mx2)
if(mx1!=g2[i][x]) mx2=g2[i][x];
}
if(g1[i][y]>mx1){
mx2=mx1;
mx1=g1[i][y];
}
else if(g1[i][y]>mx2)
if(mx1!=g1[i][y]) mx2=g1[i][y];
if(g2[i][y]>mx1){
mx2=mx1;
mx1=g2[i][y];
}
else if(g2[i][y]>mx2)
if(mx1!=g2[i][y]) mx2=g2[i][y];
x=fat[i][x];
y=fat[i][y];
}
}
if(g1[0][x]>mx1){
mx2=mx1;
mx1=g1[0][x];
}
else if(g1[0][x]>mx2)
if(mx1!=g1[0][x]) mx2=g1[0][x];
if(g1[0][y]>mx1){
mx2=mx1;
mx1=g1[0][y];
}
else if(g1[0][y]>mx2)
if(mx1!=g1[0][y]) mx2=g1[0][y];
return;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].w);
sort(p+1,p+m+1,cmp);
for(int i=1;i<=n;i++)
f[i]=i;
k();
dfs(1,0);
for(int i=1;i<=19;i++)
for(int j=1;j<=n;j++){
fat[i][j]=fat[i-1][fat[i-1][j]];
g1[i][j]=max(g1[i-1][j],g1[i-1][fat[i-1][j]]);
if(g1[i-1][j]!=g1[i-1][fat[i-1][j]]) g2[i][j]=max(g1[i-1][j],g1[i-1][fat[i-1][j]]);
else g2[i][j]=max(g2[i-1][j],g2[i-1][fat[i-1][j]]);
}
long long ans=3e15;
for(int i=1;i<=n;i++)
for(int j=h[i];j;j=e[j].nxt){
if(e[j].tr||i>=e[j].to) continue;
lca(i,e[j].to);
if(e[j].w==mx1) ans=min(ans,aans-mx2+e[j].w);
else ans=min(ans,aans-mx1+e[j].w);
}
printf("%lld",ans);
return 0;
}