#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 510, M = 10010;
int n,m;
int e[N*2],ne[N*2],w[N*2],h[N],idx;
ll d1[N][N],d2[N][N],p[N];
bool st[N];
struct Node
{
int x,y,w;
bool str;
}edge[M];
bool cmp(Node a,Node b)
{
return a.w<b.w;
}
void add(int a,int b, int c)
{
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int find(int x)
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
void dfs(int root ,int fa,int u,int maxd1,int maxd2)
{
d1[root][u]=maxd1,d2[root][u]=maxd2;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if (st[j]) continue;
int td1 = maxd1, td2 = maxd2;
if (w[i] > td1) td2 = td1, td1 = w[i];
else if (w[i] < td1 && w[i] > td2) td2 = w[i];
st[j] = true;
dfs(root, fa, j, td1, td2);
}
}
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,cmp);
for(int i=1;i<=n;i++) p[i]=i;
ll sum=0;
for(int i=0;i<m;i++)
{
int a=edge[i].x,b=edge[i].y,c=edge[i].w;
int pa=find(a),pb=find(b);
if(pa!=pb)
{
sum+=c;
p[pa]=pb;
edge[i].str=true;
add(a,b,c),add(b,a,c);
}
}
for(int i=1;i<=n;i++)
{
memset(st,false,sizeof st);
st[i]=true;
dfs(i,-1,i,-1e9,-1e9);
}
ll res=1e18;
for(int i=0;i<m;i++)
{
if(!edge[i].str)
{
ll t;
int a=edge[i].x,b=edge[i].y,w=edge[i].w;
if(w>d1[a][b]) t=sum+w-d1[a][b];
else t=sum+w-d2[a][b];
res=min(res,t);
}
}
cout<< res <<'\n';
return 0;
}