#include<bits/stdc++.h>
using namespace std;
const int N=1000010,M=2000010;
struct E{
int a,b,w;
bool used;
}edge[M];
int h[N],e[M],w[M],ne[M],idx;
int p[N];
int n,m;
int dis1[N][N],dis2[N][30];
int dep[N],f[N][30];
bool cmp(E a,E b){
return a.w<b.w;
}
void add(int a,int b,int c){
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
int find(int x){
if(x!=p[x]){
p[x]=find(p[x]);
}
return p[x];
}
void dfs(){
memset(dep,0x3f,sizeof dep);
dep[0]=0;
dep[1]=1;
queue<int> q;
q.push(1);
while(!q.empty()){
int p=q.front();
q.pop();
for(int i=h[p];i!=-1;i=ne[i]){
int j=e[i];
if(dep[j]>dep[p]){
dep[j]=dep[p]+1;
q.push(j);
f[j][0]=p;
dis1[j][0]=w[i];
dis2[j][0]=-0x3f3f3f3f;
for(int k=1;k<=30;k++){
int anc=f[j][k-1];
f[j][k]=f[anc][k-1];
int distance[4]={dis1[j][k-1],dis1[anc][k-1],dis2[j][k-1],dis2[anc][k-1]};
dis1[j][k]=-0x3f3f3f3f;
dis2[j][k]=-0x3f3f3f3f;
for(int u=0;u<4;u++){
int d=distance[u];
if(d>dis1[j][k]){
dis2[j][k]=dis1[j][k];
dis1[j][k]=d;
}
else if(d<dis1[j][k]&&d>dis2[j][k]){
dis2[j][k]=d;
}
}
}
}
}
}
}
long long lca(int a,int b,int w){
int dis[2*N];
int cnt=0;
if(dep[a]<dep[b]){
swap(a,b);
}
for(int k=10;k<=0;k--){
if(dep[f[a][k]]>=dep[b]){
a=f[a][k];
dis[cnt++]=dis1[a][k];
dis[cnt++]=dis2[a][k];
}
}
if(a!=b){
for(int k=10;k<=0;k--){
if(f[a][k]!=f[b][k]){
dis[cnt++]=dis1[a][k];
dis[cnt++]=dis2[b][k];
dis[cnt++]=dis2[a][k];
dis[cnt++]=dis2[b][k];
a=f[a][k];
b=f[b][k];
}
}
}
dis[cnt++]=dis1[a][0];
dis[cnt++]=dis1[b][0];
int max1=-0x3f3f3f3f;
int max2=-0x3f3f3ff3;
for(int i=0;i<cnt;i++){
if(dis[i]>max1){
max2=max1;
max1=dis[i];
}
else if(dis[i]<max1 && dis[i]>max2){
max2=dis[i];
}
}
if(w>max1){
return w=max1;
}
return w-max2;
}
int main(){
int n,m;
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=1;i<=m;i++){
cin>>edge[i].a>>edge[i].b>>edge[i].w;
}
sort(edge+1,edge+m+1,cmp);
for(int i=1;i<=n;i++) p[i]=i;
long long sum=0;
for(int i=1;i<=m;i++){
int a=edge[i].a,b=edge[i].b,c=edge[i].w;
int pa=find(a),pb=find(b);
if(pa!=pb){
p[pa]=pb;
sum+=c;
edge[i].used=1;
add(a,b,c);
add(b,a,c);
}
}
dfs();
long long res=1e18;
for(int i=1;i<=m;i++){
if(edge[i].used==0){
int a=edge[i].a,b=edge[i].b,c=edge[i].w;
res=min(res,sum+lca(a,b,c));
}
}
cout<<res<<endl;
return 0;
}