#include <cstdio>
#include <set>
#include <utility>
#include <vector>
#include <tuple>
#include <queue>
#include <unordered_map>

using namespace std;
typedef tuple <int, int, int> T;

int main()
{
	int v, e, i, j, k, t, d = 0, cost = 0, pcost = 0X7FFFFFFF;
	scanf("%d %d", &v, &e);
	vector<unordered_map<int, int>> graph(v + 1);
	vector<unordered_map<int, bool>> inc(v + 1);
	vector<int> parent(v + 1);
	vector<int> depth(v + 1);
	priority_queue<T, vector<T>, greater<T>> edge;

	for (i = 0; i < e; i++)
	{
		scanf("%d %d %d", &j, &k, &t);
		graph[j].insert(pair<int, int>(k, t));
		graph[k].insert(pair<int, int>(j, t));
		inc[j].insert(pair<int, bool>(k, false));
		inc[k].insert(pair<int, bool>(j, false));
	}

	auto iter = graph[1].begin();
	for (; iter != graph[1].end(); iter++)
		edge.push(tuple<int, int, int>(iter->second, 1, iter->first));
	parent[1] = -1;

	for (i = 1; i < v; i++)
	{
		while (true)
		{
			if (edge.empty())
			{
				printf("-1");
				return 0;
			}
			T ed = edge.top();
			edge.pop();
			if (parent[get<2>(ed)] == 0)
			{
				cost += get<0>(ed);
				parent[get<2>(ed)] = get<1>(ed);
				depth[get<2>(ed)] = depth[get<1>(ed)] + 1;
				inc[get<1>(ed)][get<2>(ed)] = true;
				inc[get<2>(ed)][get<1>(ed)] = true;

				for (iter = graph[get<2>(ed)].begin(); iter != graph[get<2>(ed)].end(); iter++)
				{
					if (parent[iter->first] == 0)
						edge.push(tuple<int, int, int>(iter->second, get<2>(ed), iter->first));
				}
				break;
			}
		}
	}

	for (i = 1; i < v; i++)
	{
		for (iter = graph[i].begin(); iter != graph[i].end(); iter++)
		{
			if (i > iter->first || inc[i][iter->first])
				continue;

			int cursor1 = i, cursor2 = iter->first;
			while (cursor1 != cursor2)
			{
				if (depth[cursor1] > depth[cursor2])
				{
					if (iter->second - graph[cursor1][parent[cursor1]] < pcost && iter->second - graph[cursor1][parent[cursor1]] > 0)
						pcost = iter->second - graph[cursor1][parent[cursor1]];
					cursor1 = parent[cursor1];
				}
				else
				{
					if (iter->second - graph[cursor2][parent[cursor2]] < pcost && iter->second - graph[cursor2][parent[cursor2]] > 0)
						pcost = iter->second - graph[cursor2][parent[cursor2]];
					cursor2 = parent[cursor2];
				}
			}
		}
	}

	if (pcost == 0X7FFFFFFF)
		printf("-1");
	else
		printf("%d", cost + pcost);
}