#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int s=0,w=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')w=-1;
c=getchar();
}
while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
return s*w;
}
inline void print(int x)
{
if(x<0)x=-x,putchar('-');
if(x>=10)print(x/10);
putchar(x%10+48);
}
struct node
{
int u,v,w;
bool operator<(const node &x)const
{
return w<x.w;
}
}G[1000010];
struct edge{
int v,w,next;
}e[1000010];
int n,m,eid=1,head[1000010],fa[1000010],dep[1000010],f[100010][20],w[100010][20],w1[100010][20],res,vis[100010],ans=0;
inline int get(int x)
{
return fa[x]==x?x:fa[x]=get(fa[x]);
}
inline void insert(int u,int v,int w)
{
e[eid].v=v;
e[eid].w=w;
e[eid].next=head[u];
head[u]=eid++;
}
inline void dfs(int u,int fa)
{
f[u][0]=fa;
dep[u]=dep[fa]+1;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(v==fa)continue;
w[v][0]=e[i].w;
dfs(v,u);
}
}
inline int Max(int a,int b)
{
if(dep[a]<dep[b])swap(a,b);
int ma=0;
for(int i=19;i>=0;--i)
{
if(dep[f[a][i]]>=dep[b])
{
ma=max(ma,w[a][i]);
a=f[a][i];
}
}
if(a==b)return ma;
for(int i=19;i>=0;--i)
{
if(f[a][i]!=f[b][i])
{
ma=max({ma,w[a][i],w[b][i]});
a=f[a][i];
b=f[b][i];
}
}
return max({ma,w[a][0],w[b][0]});
}
inline int ciMax(int a,int b)
{
if(dep[a]<dep[b])swap(a,b);
int ma=-1,cima=-1;
for(int i=19;i>=0;--i)
{
if(dep[f[a][i]]>=dep[b])
{
if(w[a][i]>ma)
{
cima=ma;
ma=w[a][i];
}
else if(w[a][i]>cima)
{
cima=w[a][i];
}
if(w1[a][i]>cima)
{
cima=w1[a][i];
}
a=f[a][i];
}
}
if(a==b)return cima;
for(int i=19;i>=0;--i)
{
if(f[a][i]!=f[b][i])
{
int c[4]={w[a][i],w[b][i],w1[a][i],w1[b][i]};
sort(c,c+4);
int m=unique(c,c+4)-c;
if(c[0]>ma)
{
cima=ma;
ma=c[0];
}
else if(c[0]>cima)
{
cima=c[0];
}
if(c[1]>cima)
{
cima=c[1];
}
a=f[a][i];
b=f[b][i];
}
}
int c[4]={w[a][0],w[b][0],w1[a][0],w1[b][0]};
sort(c,c+4,greater<int>());
int m=unique(c,c+4)-c;
if(c[0]>ma)
{
cima=ma;
ma=c[0];
}
else if(c[0]>cima)
{
cima=c[0];
}
if(c[1]>cima)
{
cima=c[1];
}
return cima;
}
signed main()
{
n=read();
m=read();
memset(w,-1,sizeof(w));
memset(w1,-1,sizeof(w1));
for(int i=1;i<=m;i++)
{
int u=read(),v=read(),w=read();
G[i]={u,v,w};
}
for(int i=1;i<=n;i++)fa[i]=i;
sort(G+1,G+m+1);
for(int i=1;i<=m;i++)
{
int u=get(G[i].u),v=get(G[i].v);
if(u!=v)
{
fa[u]=v;
insert(G[i].u,G[i].v,G[i].w);
insert(G[i].v,G[i].u,G[i].w);
vis[i]=1;
res+=G[i].w;
}
}
ans=0x3f3f3f3f;
dfs(1,0);
for(int j=1;j<=19;j++)
{
for(int i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
w[i][j]=max(w[i][j-1],w[f[i][j-1]][j-1]);
int c[4]={w[i][j-1],w[f[i][j-1]][j-1],w1[i][j-1],w1[f[i][j-1]][j-1]};
sort(c,c+4,greater<int>());
int m=unique(c,c+4)-c;
w1[i][j]=c[1];
}
}
for(int i=1;i<=m;i++)
{
if(vis[i])continue;
int u=G[i].u,v=G[i].v,w=G[i].w;
int a=Max(u,v),b=ciMax(u,v);
if(a==w)a=b;
if(a==-1)continue;
ans=min(ans,res-b+w);
}
print(ans);
}