#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5*114514;
struct node{
int nxt,to,val;
}tree[maxn];
struct edge{
int u,v,w;
bool used;
}web[maxn];
int head[maxn],top;
int n,m,fa[maxn],minnsum=0;
int id[maxn][30],mx[maxn][30],nxmx[maxn][30],dep[maxn];
bool compare(edge a,edge b){
return a.w<b.w;
}
void add(int u,int v,int w){
tree[++top].nxt=head[u];
tree[top].to=v;
tree[top].val=w;
head[u]=top;
}
int find(int x){
if(x==fa[x])return x;
else return fa[x]=find(fa[x]);
}
void kruskal(){
sort(web+1,web+m+1,compare);
for(int i=1;i<=m;i++){
int u=find(web[i].u),v=find(web[i].v);
if(u==v)continue;
minnsum+=web[i].w;
add(web[i].u,web[i].v,web[i].w);
add[web[i].v,web[i].u,web[i].w];
web[i].used=1;
fa[v]=u;
}
}
void dfs(int u){
dep[u]=dep[id[u][0]]+1;
for(int i=1;i<=28;i++){
id[u][i]=id[id[u][i-1]][i-1];
if(mx[u][i-1]==mx[id[u][i-1]][i-1]){
mx[u][i]=mx[u][i-1];
nxmx[u][i]=max(nxmx[id[u][i-1]][i-1],nxmx[u][i-1]);
}
if(mx[u][i-1]>mx[id[u][i-1]][i-1]){
mx[u][i]=mx[u][i-1];
nxmx[u][i]=max(nxmx[u][i-1],mx[id[u][i-1]][i-1]);
}
if(mx[u][i-1]<mx[id[u][i-1]][i-1]){
mx[u][i]=mx[id[u][i-1]][i-1];
nxmx[u][i]=max(nxmx[id[u][i-1]][i-1],mx[u][i-1]);
}
}
for(int i=head[u];i;i=tree[i].nxt){
int v=tree[i].to,w=tree[i].val;
if(v==id[u][0])continue;
id[v][0]=u;
mx[v][0]=w;
dfs(v);
}
}
int lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
for(int i=28;i>=0;i--){
if(dep[u]-dep[v]>=(1<<i))
u=id[u][i];
}
if(u==v)return u;
for(int i=28;i>=0;i--){
if(id[u][i]!=id[v][i])u=id[u][i];
v=id[v][i];
}
return id[u][0];
}
int doit(int u,int v,int w){
int llca=lca(u,v);
int maxx=0,nxmaxx=0;
for(int i=28;i>=0;i--){
if(dep[id[u][i]]>=dep[llca]){
if(maxx==mx[u][i])nxmaxx=max(nxmx[u][i],nxmaxx);
if(maxx>mx[u][i])nxmaxx=max(mx[u][i],nxmaxx);
if(maxx<mx[u][i]){
nxmaxx=max(nxmx[u][i],maxx);
maxx=mx[u][i];
}
u=id[u][i];
}
if(dep[id[v][i]]>=dep[llca]){
if(maxx==mx[v][i])nxmaxx=max(nxmx[v][i],nxmaxx);
if(maxx>mx[v][i])nxmaxx=max(mx[v][i],nxmaxx);
if(maxx<mx[v][i]){
nxmaxx=max(nxmx[v][i],maxx);
maxx=mx[v][i];
}
v=id[v][i];
}
}
if(w!=maxx)return minnsum-maxx+w;
if(nxmaxx)return minnsum-nxmaxx+w;
return 0x7f7f7f7f7f7f7f7f;
}
signed main(){
int ans=0x7f7f7f7f7f7f7f7f;
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>web[i].u>>web[i].v>>web[i].w;
for(int i=1;i<=n;i++)fa[i]=i;
kruskal();
dfs(1);
for(int i=1;i<=m;i++){
if(!web[i].used)
ans=min(ans,doit(web[i].u,web[i].v,web[i].w));
}
cout<<ans<<"\n";
return 0;
}