#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int x,y;
};
struct node2{
int x,y,w;
};
node2 lin[600005],un[600005];
int n,m,a,b,c,ul=0,fa[600005],ml,x,ex=0,y,w,ans=0,l=0,ll,di[600005],ff[600005][22],ffmax[600005][32],f2max[600005][32],lg[600005],anss=99999999,maxx,max2;
vector<node>vi[600005];
int find(int x){
if(fa[x]==x){
return x;
}
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
fa[find(x)]=find(y);
}
bool cmp(node2 a,node2 b){
return a.w<b.w;
}
void dfs(int x,int fat,int lasw){
ff[x][0]=fat;
ffmax[x][0]=lasw;
di[x]=di[fat]+1;
for(int i=1;i<=lg[di[x]];i++){
ff[x][i]=ff[ff[x][i-1]][i-1];
if(ffmax[x][i-1]>ffmax[ff[x][i-1]][i-1]){
ffmax[x][i]=ffmax[x][i-1];
f2max[x][i]=max(ffmax[ff[x][i-1]][i-1],max(f2max[x][i-1],f2max[ff[x][i-1]][i-1]));
}
else{
ffmax[x][i]=ffmax[ff[x][i-1]][i-1];
if(ffmax[x][i-1]==ffmax[x][i]){
f2max[x][i]=max(f2max[x][i-1],f2max[ff[x][i-1]][i-1]);
}
else{
f2max[x][i]=max(ffmax[x][i-1],max(f2max[x][i-1],f2max[ff[x][i-1]][i-1]));
}
}
}
for(int i=0;i<vi[x].size();i++){
int v=vi[x][i].x,w=vi[x][i].y;
if(v!=fat){
dfs(v,x,w);
}
}
}
void LCA(int x,int y){
maxx=0;
max2=0;
if(di[x]<di[y]){
swap(x,y);
}
while(di[x]>di[y]){
if(ffmax[x][lg[di[x]-di[y]]-1]>maxx){
max2=maxx;
maxx=ffmax[x][lg[di[x]-di[y]]-1];
}
else if(f2max[x][lg[di[x]-di[y]]-1]!=maxx){
max2=max(max2,f2max[x][lg[di[x]-di[y]]-1]);
}
x=ff[x][lg[di[x]-di[y]]-1];
}
if(x==y){
return;
}
for(int k=lg[di[x]]-1;k>=0;k--){
if(ff[x][k]!=ff[y][k]){
x=ff[x][k];
y=ff[y][k];
}
if(ffmax[x][k]>maxx){
max2=maxx;
maxx=ffmax[x][k];
}
if(f2max[x][k]!=maxx){
max2=max(max2,f2max[x][k]);
}
if(ffmax[y][k]>maxx){
max2=maxx;
maxx=ffmax[y][k];
}
if(f2max[y][k]!=maxx){
max2=max(max2,f2max[y][k]);
}
}
}
signed main(){
memset(ff,127,sizeof(ff));
cin>>n>>m;
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
if(a==b){
continue;
}
ml++;
lin[ml].x=a;
lin[ml].y=b;
lin[ml].w=c;
}
m=ml;
sort(lin+1,lin+1+m,cmp);
for(int i=1;i<=m*2;i++){
x=lin[i].x;
y=lin[i].y;
w=lin[i].w;
if(find(x)==find(y)){
ul++;
un[ul]=lin[i];
continue;
}
vi[x].push_back(node{y,w});
vi[y].push_back(node{x,w});
ans+=w;
l++;
merge(x,y);
if(l==n-1){
ll=i+1;
break;
}
}
for(int i=1;i<=n;i++){
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
dfs(1,0,0);
for(int j=ll;j<=m;j++){
LCA(lin[j].x,lin[j].y);
if(maxx==lin[j].w){
anss=min(anss,ans+lin[j].w-max2);
}
else{
anss=min(anss,ans+lin[j].w-maxx);
}
}
for(int j=1;j<=ul;j++){
LCA(un[j].x,un[j].y);
if(maxx==un[j].w){
anss=min(anss,ans+un[j].w-max2);
}
else{
anss=min(anss,ans+un[j].w-maxx);
}
}
cout<<anss;
}