#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<utility>
#include<vector>
#include<queue>
#include<limits.h>
#define in inline
#define re register
#define itn int
#define FOR(i,a,b) for(re int i=a;i<=b;i++)
#define ROF(i,a,b) for(re int i=a;i>=b;i--)
#define mp(a,b) make_pair(a,b)
#define int long long
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
typedef long long ll;
const int N=1e5+5;
const int M=3e5+5;
const ll INF=1e15;
in int read();
int n,m,k;
struct RR{
int u,v,w;
}edgek[M];
struct E{
int to,nex,w;
}edge[M];
int head[N],cnt_=0;
void add(int u,int v,int w)
{
edge[++cnt_].nex=head[u];
edge[cnt_].w=w;
edge[cnt_].to=v;
head[u]=cnt_;
}
bool cmp(RR x,RR y){
return x.w<y.w;
}
ll W=0;
int f_[N];
int get(int k)
{
return f_[k]==k?k:f_[k]=get(f_[k]);
}
int vis[N];
int f[N][30];
ll fm[N][30],sm[N][30];
void kruskal()
{
int cnt=0;
FOR(i,1,n) f_[i]=i;
FOR(i,1,m)
{
int u=edgek[i].u,v=edgek[i].v;
ll w=edgek[i].w;
int fu=get(u);
int fv=get(v);
if(fu==fv||u==v) continue;
f_[fu]=fv;
cnt++;
W+=w;
vis[i]=1;
add(u,v,w);
add(v,u,w);
if(cnt==n-1) break;
}
}
int dep[N];
void dfs(int u,int fa)
{
for(int i=1;(1<<i)<=dep[u]+1;i++)
{
f[u][i]=f[f[u][i-1]][i-1];
fm[u][i]=max(fm[u][i-1],fm[f[u][i-1]][i-1]);
sm[u][i]=max(sm[u][i-1],sm[f[u][i-1]][i-1]);
if(fm[u][i-1]<fm[f[u][i-1]][i-1]) sm[u][i]=max(sm[u][i],fm[u][i-1]);
else if(fm[u][i-1]>fm[f[u][i-1]][i-1]) sm[u][i]=max(sm[u][i],fm[f[u][i-1]][i-1]);
}
for(int i=head[u];i;i=edge[i].nex)
{
int y=edge[i].to;
if(y==fa) continue;
dep[y]=dep[u]+1;
f[y][0]=u;
fm[y][0]=(ll)edge[i].w;
dfs(y,u);
}
}
int LCA(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
int k=dep[u]-dep[v];
for(int i=log2(k)+1;i>=0;i--)
if(k>>i&1) u=f[u][i];
if(u==v) return u;
for(int i=log2(dep[u])+1;i>=0;i--)
if(f[u][i]!=f[v][i])
{
u=f[u][i];
v=f[v][i];
}
return f[u][0];
}
ll findmax(int u,int lca,int val)
{
ll ans=0;
for(int i=20;i>=0;i--)
{
if(dep[f[u][i]]>=dep[lca])
{
if(fm[u][i]==val)
ans=max(ans,sm[u][i]);
else ans=max(ans,fm[u][i]);
u=f[u][i];
}
}
return ans;
}
void calc()
{
ll ans=INF;
FOR(i,1,m)
{
if(vis[i]) continue;
int u=edgek[i].u;
int v=edgek[i].v;
ll w=edgek[i].w;
if(u==v) continue;
int lca=LCA(u,v);
ll a1=findmax(u,lca,w);
ll a2=findmax(v,lca,w);
if(max(a1,a2)!=w)
ans=min(ans,W-max(a1,a2)+w);
}
printf("%lld",ans);
}
signed main()
{
scanf("%lld%lld",&n,&m);
FOR(i,1,m)
{
int u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
edgek[i].u=u;
edgek[i].v=v;
edgek[i].w=w;
}
sort(edgek+1,edgek+1+m,cmp);
kruskal();
dep[1]=1;
dfs(1,0);
calc();
return 0;
}
in int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return f*x;
}