#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N =4e5+10;
struct edge
{
int a,b,w;
bool operator< (const edge W)const
{
return w<W.w;
}
}edge[N];
int dep[N],p[N],f[N][25],m1[N][25],m2[N][25],_lg[N];
int h[N],e[N],ne[N],w[N],idx,p1[N];
bool st[N];
LL sum;
int n,m;
void add(int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int p)
{
f[u][0]=p;
dep[u]=dep[p]+1;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j==p) continue;
m1[j][0]=w[i];
dfs(j,u);
}
}
void unit()
{
for(int i=1;i<=n;i++) _lg[i]=_lg[i>>1]+1;
for(int j=1;j<25;j++)
for(int i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
m1[i][j]=max(m1[ f[i][j-1] ][j-1],m1[i][j-1]);
m2[i][j]=max(m2[ f[i][j-1] ][j-1],m2[i][j-1]);
if(m1[i][j-1]>m1[f[i][j-1]][j-1]) m2[i][j]=max(m2[i][j],m1[f[i][j-1]][j-1]);
else if(m1[i][j-1]<m1[f[i][j-1]][j-1]) m2[i][j]=max(m2[i][j],m1[i][j-1]);
}
}
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
void kruskal()
{
for(int i=0;i<m;i++)
{
int a=edge[i].a,b=edge[i].b,c=edge[i].w;
int x=find(a),y=find(b);
if(x!=y)
{
st[i]=true;
p[y]=x;
sum+=c;
add(a,b,c),add(b,a,c);
}
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y]) return lca(y,x);
int t=dep[x]-dep[y];
for(int i=_lg[t];i>=0;i--)
{
if((t>>i)&1) x=f[x][i];
}
if(x==y) return x;
for(int i=_lg[dep[x]];i>=0;i--)
{
if(f[x][i]^f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int qm(int u,int v,int c)
{
int ans=-1e9;
for(int i=_lg[dep[u]];i>=0;i--)
{
if(dep[f[u][i]]<=dep[v])
{
if(m1[u][i]==c) ans=m2[u][i];
else ans=m1[u][i];
}
}
return ans;
}
LL _min(LL a,LL b)
{
return a<b?a:b;
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
edge[i]={a,b,c};
}
sort(edge,edge+m);
for(int i=1;i<=n;i++) p[i]=i;
kruskal();
dfs(1,1);
unit();
LL ans=1e18;
for(int i=0;i<m;i++)
{
if(!st[i])
{
int a=edge[i].a,b=edge[i].b,c=edge[i].w;
int x=qm(a,lca(a,b),c);
int y=qm(b,lca(a,b),c);
int res=max(x,y);
if(res) ans=_min(ans,sum+c-res);
}
}
cout<<ans<<endl;
return 0;
}