from collections import defaultdict from heapq import heappush, heappop def dijkstra(n: int, sv, adj): dists = [INF] * n dists[sv] = 0 q = [(0, sv)] while q: d, v = heappop(q) if dists[v] != d: continue for to, w in adj[v]: nd = dists[v] + w if dists[to] > nd: dists[to] = nd heappush(q, (nd, to)) return dists INF = 1 << 62 T = int(input()) N, M = map(int, input().split()) edges = [] for _ in range(M): U, V, W = map(int, input().split()) U -= 1 V -= 1 edges.append((U, V, W)) def solve_undirected(): res = INF adj = defaultdict(list) edge2w = {} for u, v, w in edges: adj[u].append((v, w)) adj[v].append((u, w)) edge2w[u, v] = w used = set() for i in range(N): # 頂点 i を始点とする最短経路を求める # if i in used: continue dists = dijkstra(N, i, adj) for j in range(N): if dists[j] == INF: continue if (j, i) in edge2w: res = min(res, dists[j] + edge2w[(j, i)]) return res def solve_directed(): res = INF adj = defaultdict(list) edge2w = {} for u, v, w in edges: adj[u].append((v, w)) edge2w[u, v] = w for i in range(N): # 頂点 i を始点として、各頂点への最小経路を作る dists = [INF] * N dists[i] = 0 q = [(0, i)] while q: d, v = heappop(q) if dists[v] != d: continue for to, w in adj[v]: nd = dists[v] + w if dists[to] > nd: dists[to] = nd heappush(q, (nd, to)) # 各頂点から始点 i への有向辺があるなら閉路が存在する for j in range(N): if dists[j] != INF: if (j, i) in edge2w: res = min(res, dists[j] + edge2w[j, i]) if res == INF: return -1 return res if T == 0: ans = solve_undirected() print(ans) else: ans = solve_directed() print(ans)