rt
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long root[100010],dep[100010],fa[100010][20],dmax[100010][20],dmaxc[100010][20];
bool used[600060];
long long dis;
long long edis[600060];
int find(int x){
if(x!=root[x])root[x]=find(root[x]);
return root[x];
}
inline 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 x*f;
}
struct lst{
int f=-1,x,y,w;
bool operator<(const lst &x)const
{
return x.w>w;
}
}e[600060],tr[600060];
queue<int> o;
int h[200020],cnt=1;
void add(int xx,int yy,int ww){
tr[cnt].f=h[xx];
tr[cnt].x=xx;
tr[cnt].y=yy;
tr[cnt].w=ww;
h[xx]=cnt++;
}
long long lcs(int a,int b,int w1){
long long mx=0,cmax=0,shu[100010],cnts=0;
while(dep[a]!=dep[b]){
int k;
for(k=16;k>=0;k--){
if(dep[a]-(1<<k)>=dep[b])break;
}
a=fa[a][k];
shu[++cnts]=dmax[a][k];
shu[++cnts]=dmaxc[a][k];
}
while(a!=b){
int k=16;
while(fa[a][k]==fa[b][k]&&k>0)k--;
a=fa[a][k];
b=fa[b][k];
shu[++cnts]=dmax[a][k];
shu[++cnts]=dmax[b][k];
shu[++cnts]=dmaxc[a][k];
shu[++cnts]=dmaxc[b][k];
}
for(int i=1;i<=cnts;i++){
mx=max(mx,shu[i]);
if(shu[i]!=mx)cmax=max(cmax,shu[i]);
}
if(mx!=w1)return mx;
else return cmax;
}
void dfs(int p){
o.push(p);
for(int i=1;i<=100000;i++)dep[i]=1<<17;
dep[p]=0;
while(!o.empty()){
int i=h[o.front()];
o.pop();
for(;i!=-1;i=tr[i].f){
lst q=tr[i];
//cout<<endl<<tr[i].x<<' '<<dep[q.x]<<' '<<dep[q.y]<<endl;
if(dep[q.y]<dep[q.x])continue;
o.push(q.y);
dep[q.y]=dep[q.x]+1;
fa[q.y][0]=q.x;
for(int k=1;k<=16;k++){
fa[q.y][k]=fa[fa[q.y][k-1]][k-1];
}
dmax[q.y][0]=q.w;
dmaxc[q.y][0]=0;
for(int k=1;k<=16;k++){
dmax[q.y][k]=max(dmax[q.y][k-1],dmax[fa[q.y][k-1]][k-1]);
if(dmax[q.y][k-1]==dmax[fa[q.y][k-1]][k-1])dmaxc[q.y][k]=max(dmaxc[q.y][k-1],dmaxc[fa[q.y][k-1]][k-1]);
else{
dmaxc[q.y][k]=max(dmaxc[q.y][k-1],max(dmaxc[fa[q.y][k-1]][k-1],min(dmax[q.y][k-1],dmax[fa[q.y][k-1]][k-1])));
}
}
}
}
return ;
}
int main(){
cin>>n>>m;
int cnt2=0;
for(int i=1;i<=m;i++){
int a1,b1,c1;
a1=read();
b1=read();
c1=read();
if(a1==b1){
cnt2++;
continue;
}
e[i].x=a1;
e[i].y=b1;
e[i].w=c1;
}
m-=cnt2;
sort(e+1,e+m+1);
for(int i=1;i<=n;i++){
root[i]=i;
}
for(int i=1;i<=m;i++){
if(root[find(e[i].x)]==root[find(e[i].y)])continue;
else{
root[find(e[i].y)]=root[find(e[i].x)];
dis+=e[i].w;
used[i]=1;
}
}
memset(h,-1,sizeof(h));
for(int i=1;i<=m;i++){
if(!used[i])continue;
add(e[i].x,e[i].y,e[i].w);
add(e[i].y,e[i].x,e[i].w);
}
dfs(1);
long long ans=1<<30;
for(int i=1;i<=m;i++){
if(used[i])continue;
if(dep[e[i].x]>=dep[e[i].y]){
ans=min(ans,dis+e[i].w-lcs(e[i].x,e[i].y,e[i].w));
}
else{
ans=min(ans,dis+e[i].w-lcs(e[i].y,e[i].x,e[i].w));
}
}
cout<<ans;
}