#include <bits/stdc++.h>

#define ll long long
#define double long double
#define all(v) v.begin(), v.end()
#define ii pair<int, int>
#define fi first
#define se second
#define pb push_back
#define maximize(a, b) a = max(a, b)
#define minimize(a, b) a = min(a, b)
#define cbit(n) __builtin_popcount(n)
#define getbit(n, i) (n >> i) & 1
#define onbit(n, i) n | (1 << i)
#define offbit(n, i) n ^ (1 << i)
#define TASK "1"

using namespace std;

const int N = 3e5 + 5;
const ll oo = 1e18;
const int base = 311;
//const int sz = sqrt(N);
const int mod = 1e9 + 7;
int par[N], sz[N], h[N], mx[19][N], mx2[19][N], up[19][N], vis[N];
int n, m;
vector<ii> g[N];

struct edge
{
    int u, v, w;

    bool operator < (const edge &b) const
    {
        return w < b.w;
    }
} e[N];

void build(int u)
{
    sz[u] = 1;
    par[u] = u;
}

int f(int u) { return u == par[u] ? u : par[u] = f(par[u]); }

bool join(int u, int v)
{
    u = f(u);
    v = f(v);
    if(u != v){
        if(sz[u] < sz[v]) swap(u, v);
        sz[u] += sz[v];
        par[v] = u;
        return true;
    }
    return false;
}

int max2(int a, int b, int c, int d)
{
    int mx = max(max(a, b), max(c, d));
    int res = 0;
    if(a != mx) maximize(res, a);
    if(b != mx) maximize(res, b);
    if(c != mx) maximize(res, c);
    if(d != mx) maximize(res, d);
    return res;
}

void dfs(int u, int p)
{
    up[0][u] = p;
    for(int i = 1; i <= 18; i++){
        up[i][u] = up[i - 1][up[i - 1][u]];
        mx[i][u] = max(mx[i - 1][u], mx[i - 1][up[i - 1][u]]);
        mx2[i][u] = max2(mx2[i - 1][u], mx2[i -  1][up[i - 1][u]], mx[i - 1][u], mx[i - 1][up[i - 1][u]]);
    }
    for(ii v : g[u]){
        if(v.fi == p) continue;
        h[v.fi] = h[u] + 1;
        mx[0][v.fi] = v.se;
        dfs(v.fi, u);
    }
}

int lca(int u, int v, int w)
{
    int res = 0, res2 = 0;
    if(h[u] != h[v]){
        if(h[u] < h[v]) swap(u, v);
        int d = h[u] - h[v];
        for(int i = 18; i >= 0; i--){
            if(getbit(d, i)){
                res2 = max2(mx[i][u], mx2[i][u], res, res2);
                maximize(res, mx[i][u]);
                u = up[i][u];
            }
        }
    }
    if(u == v) return (res == w ? res2 : res);
    for(int i = 18; i >= 0; i--){
        if(up[i][u] != up[i][v]){
            res2 = max2(res2, mx[i][u], mx[i][v], mx2[i][v]);
            res2 = max2(res2, mx[i][v], mx2[i][u], res);
            maximize(res, mx[i][u]);
            maximize(res, mx[i][v]);
            u = up[i][u];
            v = up[i][v];
        }
    }
    res2 = max2(res2, mx[0][u], mx[0][v], mx2[0][v]);
    res2 = max2(res2, mx[0][v], mx2[0][u], res);
    maximize(res, mx[0][u]);
    maximize(res, mx[0][v]);
    if(res == w) return res2;
    return res;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    if(fopen(TASK".inp", "r")){
        freopen(TASK".inp", "r", stdin);
        freopen(TASK".out", "w", stdout);
    }

    cin >> n >> m;
    for(int i = 1; i <= n; i++) build(i);
    for(int i = 1; i <= m; i++) cin >> e[i].u >> e[i].v >> e[i].w;
    sort(e + 1, e + 1 + m);
    ll res = 0, cur = 0;
    for(int i = 1; i <= m; i++){
        if(join(e[i].u, e[i].v)){
            cur += 1LL * e[i].w;
            g[e[i].u].pb({e[i].v, e[i].w});
            g[e[i].v].pb({e[i].u, e[i].w});
            vis[i] = 1;
        }
    }
    dfs(1, 0);
    res = oo;
    for(int i = 1; i <= m; i++){
        if(!vis[i]){
//            cerr << e[i].u << " " << e[i].v << " " << e[i].w << " " << lca(e[i].u, e[i].v) << "\n";
            if(lca(e[i].u, e[i].v, e[i].w)) minimize(res, cur - 1LL * lca(e[i].u, e[i].v, e[i].w) + e[i].w);
        }
    }
    cout << (res == oo ? -1 : res);
    return 0;
}
