#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int N = 100005, M = 300005;
int n, m, f[N][17], maxx[N][17], minn[N][17], dep[N];
bool vis[N];
struct edge {
int u, v, w;
bool operator<(const edge other) const
{
return w < other.w;
}
} e[M];
struct edge2 {
int v, w;
};
list<edge2> t[N];
int find(int x)
{
return x != f[x][0] ? (f[x][0] = find(f[x][0])) : x;
}
ll kruskal()
{
ll res = 0;
sort(e + 1, e + 1 + m);
for (int i = 1; i <= n; ++i)
f[i][0] = i;
for (int i = 1; i <= m; ++i) {
auto [u, v, w] = e[i];
int fu = find(u), fv = find(v);
if (fu != fv) {
res += w;
vis[i] = true;
f[fu][0] = fv;
t[u].emplace_back(v, w);
t[v].emplace_back(u, w);
}
}
return res;
}
void dfs(int u, int fa)
{
f[u][0] = fa;
dep[u] = dep[fa] + 1;
minn[u][0] = INT_MIN;
for (int i = 1; 1 << i < dep[u]; ++i) {
f[u][i] = f[f[u][i - 1]][i - 1];
int tmp[] = { maxx[u][i - 1], maxx[f[u][i - 1]][i - 1], minn[u][i - 1], minn[f[u][i - 1]][i - 1] };
sort(tmp, tmp + 4);
maxx[u][i] = tmp[3];
int len = unique(tmp, tmp + 4) - tmp;
minn[u][i] = len > 1 ? tmp[len - 2] : INT_MIN;
}
for (auto [v, w] : t[u]) {
if (v == fa)
continue;
maxx[v][0] = w;
dfs(v, u);
}
}
int lca(int u, int v)
{
if (dep[u] < dep[v])
swap(u, v);
for (int i = 16; i >= 0; --i) {
if (dep[f[u][i]] >= dep[v])
u = f[u][i];
}
if (u == v)
return u;
for (int i = 16; i >= 0; --i) {
if (f[u][i] != f[v][i]) {
u = f[u][i];
v = f[v][i];
}
}
return f[u][0];
}
int query(int u, int fa, int x)
{
int res = INT_MIN;
for (int i = 16; i >= 0; --i) {
if (dep[f[u][i]] >= dep[fa])
res = max(res, maxx[u][i] != x ? maxx[u][i] : minn[u][i]);
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= m; ++i)
cin >> e[i].u >> e[i].v >> e[i].w;
ll s = kruskal();
dfs(1, 0);
ll ans = LLONG_MAX;
for (int i = 1; i <= m; ++i) {
if (!vis[i]) {
auto [u, v, w] = e[i];
int fa = lca(u, v);
int cur = max(query(u, fa, w), query(v, fa, w));
if (cur != INT_MIN)
ans = min(ans, s - cur + w);
}
}
cout << (ans != LLONG_MAX ? ans : -1);
return 0;
}