#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
const int M = 3e5 + 5;
const ll INF = 1e18;
int n, m, tot, a, b, dep[N], f[N], fa[N][21], Log2[N];
ll c, ANS2, val[N][21], val2[N][21];
vector <pair <int, ll> > G[N];
int ans1; ll ans2, ans3;
struct edge{
int x, y;
ll z;
bool flag;
} e[M];
bool cmp(edge a, edge b){
return a.z < b.z;
}
int find(int k){
return f[k] == k ? k : f[k] = find(f[k]);
}
void kruscal(){
int k = 0;
for(int i = 1; i <= tot; i++){
int x = e[i].x, y = e[i].y;
ll z = e[i].z;
if(find(x) != find(y)){
f[find(x)] = find(y);
ANS2 += z;
e[i].flag = 1;
G[x].push_back(make_pair(y, z));
G[y].push_back(make_pair(x, z));
if(++k == n - 1) break;
}
}
}
void dfs(int u, int F, ll V){
dep[u] = dep[F] + 1;
fa[u][0] = F;
val[u][0] = V;
for(int i = 0; i < G[u].size(); i++){
int v = G[u][i].first;
ll w = G[u][i].second;
if(v == F) continue;
dfs(v, u, w);
}
}
void LCA(int a, int b){
ans1 = ans2 = 0;
ans3 = -INF;
if(dep[a] < dep[b])
swap(a, b);
while(dep[a] != dep[b]){
int qwq = Log2[dep[a] - dep[b]];
a = fa[a][qwq];
if(ans2 > val[a][qwq])
ans3 = max(ans3, val[a][qwq]);
else if(ans2 < val[a][qwq]){
ans3 = max(ans2, val2[a][qwq]);
ans2 = val[a][qwq];
}
else
ans3 = max(ans3, val2[a][qwq]);
}
if(a == b){
ans1 = a;
return;
}
for(int i = 20; i >= 0; i--){
if(fa[a][i] != fa[b][i]){
a = fa[a][i];
b = fa[b][i];
if(ans2 > val[a][i])
ans3 = max(ans3, val[a][i]);
else if(ans2 < val[a][i]){
ans3 = max(ans2, val2[a][i]);
ans2 = val[a][i];
}
else
ans3 = max(ans3, val2[a][i]);
if(ans2 > val[b][i])
ans3 = max(ans3, val[b][i]);
else if(ans2 < val[b][i]){
ans3 = max(ans2, val2[b][i]);
ans2 = val[b][i];
}
else
ans3 = max(ans3, val2[b][i]);
}
}
ans1 = fa[a][0];
if(ans2 > val[a][0])
ans3 = max(ans3, val[a][0]);
else if(ans2 < val[a][0]){
ans3 = max(ans2, val2[a][0]);
ans2 = val[a][0];
}
else
ans3 = max(ans3, val2[b][0]);
if(ans2 > val[b][0])
ans3 = max(ans3, val[b][0]);
else if(ans2 < val[b][0]){
ans3 = max(ans2, val2[b][0]);
ans2 = val[b][0];
}
else
ans3 = max(ans3, val2[b][0]);
}
int main(){
for(int i = 1; i <= 1e5; i++)
Log2[i] = log2(i);
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d%d%lld", &a, &b, &c);
if(a == b) continue;
e[++tot].x = a;
e[tot].y = b;
e[tot].z = c;
}
sort(e + 1, e + 1 + tot, cmp);
for(int i = 1; i <= n; i++) f[i] = i;
kruscal();
dfs(1, 0, 0);
for(int i = 1; i <= n; i++)
for(int j = 0; j <= 20; j++)
val2[i][j] = -INF;
for(int j = 1; j <= 20; j++)
for(int i = 1; i <= n; i++){
fa[i][j] = fa[fa[i][j - 1]][j - 1];
if(val[i][j - 1] > val[fa[i][j - 1]][j - 1]){
val[i][j] = val[i][j - 1];
val2[i][j] = max(val2[i][j - 1], val[fa[i][j - 1]][j - 1]);
}
else if(val[i][j - 1] < val[fa[i][j - 1]][j - 1]){
val[i][j] = val[fa[i][j - 1]][j - 1];
val2[i][j] = max(val[i][j - 1], val2[fa[i][j - 1]][j - 1]);
}
else{
val[i][j] = val[i][j - 1];
val2[i][j] = max(val2[i][j - 1], val2[fa[i][j - 1]][j - 1]);
}
}
ll ANS = INF;
for(int i = 1; i <= tot; i++){
if(!e[i].flag){
LCA(e[i].x, e[i].y);
ll w = e[i].z;
if(w > ans2)
ANS = min(ANS, ANS2 - ans2 + w);
else
ANS = min(ANS, ANS2 - ans3 + w);
}
}
printf("%lld", ANS);
return 0;
}