#include<bits/stdc++.h>
using namespace std;
const long long MaxN = 3e5 + 5;
const long long LOG = 20;
long long n,m;
long long par[MaxN][LOG];
long long mx1[MaxN][LOG],mx2[MaxN][LOG];
long long d[MaxN];
vector<pair<long long,long long>> vt[MaxN];
pair<long long,pair<long long,long long>> side[MaxN];
bool check[MaxN];
struct DSU
{
long long lab[MaxN];
void init()
{
for(long long i = 1; i <= n; i++)
{
lab[i] = -1;
}
}
long long get_root(long long u)
{
if(lab[u] < 0)
return u;
return lab[u] = get_root(lab[u]);
}
void unite(long long u,long long v)
{
long long x = get_root(u);
long long y = get_root(v);
if(x == y)
return;
if(lab[x] > lab[y])
swap(x,y);
lab[x] += lab[y];
lab[y] = x;
}
bool check(long long u,long long v)
{
return get_root(u) == get_root(v);
}
} dsu;
void dfs(long long u)
{
for(auto x : vt[u])
{
long long v = x.first;
long long w = x.second;
if(v == par[u][0])
continue;
par[v][0] = u;
mx1[v][0] = w;
d[v] = d[u] + 1;
dfs(v);
}
}
void build()
{
for(long long j = 1; j < LOG; j++)
{
for(long long i = 1; i <= n; i++)
{
par[i][j] = par[par[i][j-1]][j-1];
long long a = mx1[i][j-1];
long long b = mx2[i][j-1];
long long c = mx1[par[i][j-1]][j-1];
long long e = mx2[par[i][j-1]][j-1];
mx1[i][j] = max(a,c);
mx2[i][j] = 0;
if(a != mx1[i][j])
mx2[i][j] = max(mx2[i][j],a);
if(b != mx1[i][j])
mx2[i][j] = max(mx2[i][j],b);
if(c != mx1[i][j])
mx2[i][j] = max(mx2[i][j],c);
if(e != mx1[i][j])
mx2[i][j] = max(mx2[i][j],e);
}
}
}
pair<long long,long long> get_max(long long u,long long anc)
{
long long ans1 = 0;
long long ans2 = 0;
long long diff = d[u] - d[anc];
for(long long i = LOG-1; i >= 0; i--)
{
if((diff >> i) & 1)
{
long long a = mx1[u][i];
long long b = mx2[u][i];
if(a > ans1)
{
ans2 = ans1;
ans1 = a;
}
else if(a > ans2 && a != ans1)
{
ans2 = a;
}
if(b > ans2 && b != ans1)
{
ans2 = b;
}
u = par[u][i];
}
}
return {ans1,ans2};
}
long long lca(long long u,long long v)
{
if(d[u] < d[v])
swap(u,v);
for(long long i = LOG-1; i >= 0; i--)
{
if(d[par[u][i]] >= d[v])
{
u = par[u][i];
}
}
if(u == v)
return u;
for(long long i = LOG-1; i >= 0; i--)
{
if(par[u][i] != par[v][i])
{
u = par[u][i];
v = par[v][i];
}
}
return par[u][0];
}
void input()
{
cin >> n >> m;
for(long long i = 1; i <= m; i++)
{
long long u,v,w;
cin >> u >> v >> w;
side[i] = {w,{u,v}};
}
}
void solve()
{
sort(side + 1,side + m + 1);
dsu.init();
long long mst_1 = 0;
for(long long i = 1; i <= m; i++)
{
long long u = side[i].second.first;
long long v = side[i].second.second;
long long w = side[i].first;
if(!dsu.check(u,v))
{
dsu.unite(u,v);
check[i] = true;
mst_1 += w;
}
}
d[0] = -1;
for(long long i = 1; i <= m; i++)
{
if(check[i])
{
long long u = side[i].second.first;
long long v = side[i].second.second;
long long w = side[i].first;
vt[u].push_back({v,w});
vt[v].push_back({u,w});
}
}
dfs(1);
build();
long long mst_2 = LLONG_MAX;
for(long long i = 1; i <= m; i++)
{
if(!check[i])
{
long long u = side[i].second.first;
long long v = side[i].second.second;
long long w = side[i].first;
long long l = lca(u,v);
pair<long long, long long> x = get_max(u,l);
pair<long long,long long> y = get_max(v,l);
long long max1 = max(x.first,y.first);
long long max2 = max(x.second,y.second);
if(x.first != max1)
max2 = max(max2,x.first);
if(y.first != max1)
max2 = max(max2,y.first);
long long remove_edge;
if(w > max1)
remove_edge = max1;
else
remove_edge = max2;
if(remove_edge > 0)
{
long long candidate = mst_1 - remove_edge + w;
if(candidate > mst_1)
mst_2 = min(mst_2,candidate);
}
}
}
cout << mst_2;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
input();
solve();
}