## https://yukicoder.me/problems/no/2569 import heapq MAX_INT = 10 ** 18 def solve(N, M, start, edges): next_nodes = [[] for _ in range(N)] for u, v, t in edges: next_nodes[u].append((v, t)) fix = [MAX_INT] * N seen = [MAX_INT] * N queue = [] heapq.heappush(queue, (0, start)) seen[start] = 0 while len(queue)>0: cost, v = heapq.heappop(queue) if fix[v] < MAX_INT: continue fix[v] = cost for u, w in next_nodes[v]: if fix[u] < MAX_INT: continue new_cost = w + cost if seen[u] > new_cost: seen[u] = new_cost heapq.heappush(queue, (new_cost, u)) return fix def main(): N, M = map(int, input().split()) uvt = [] uvt2 = [] for _ in range(M): u, v, t = map(int, input().split()) uvt.append((u - 1, v - 1, t)) uvt2.append((v - 1, u - 1, t)) # N -2 の訪問 dist_to_N1 = solve(N, M, N - 2, uvt2) dist_from_N1 = solve(N, M, N - 2, uvt) # N -1 の訪問 dist_to_N0 = solve(N, M, N - 1, uvt2) dist_from_N0 = solve(N, M, N - 1, uvt) for i in range(N - 2): ans1 = dist_to_N1[i] + dist_to_N0[N - 2] + dist_from_N0[i] ans2 = dist_to_N0[i] + dist_to_N1[N - 1] + dist_from_N1[i] answer = min(ans1, ans2) if answer >= MAX_INT: print(-1) else: print(answer) if __name__ == '__main__': main()