## https://yukicoder.me/problems/no/3393 import heapq MAX_VALUE = 10 ** 18 def main(): N, M, C = map(int, input().split()) next_nodes = [[] for _ in range(N)] for _ in range(M): u, v, w = map(int, input().split()) next_nodes[u - 1].append((v - 1, w)) next_nodes[v - 1].append((u - 1, w)) # 逆方向からの探索 fix = [[MAX_VALUE] * N for _ in range(2)] seen = [[MAX_VALUE] * N for _ in range(2)] queue = [] seen[0][N - 1] = 0 heapq.heappush(queue, (0, 0, N - 1)) while len(queue) > 0: cost, state, u = heapq.heappop(queue) if fix[state][u] < MAX_VALUE: continue fix[state][u] = cost for v, w in next_nodes[u]: if fix[state][v] == MAX_VALUE: new_cost = cost + w + C if seen[state][v] > new_cost: seen[state][v] = new_cost heapq.heappush(queue, (new_cost, state, v)) if state == 0: new_state = 1 if fix[new_state][v] == MAX_VALUE: new_cost = cost + C if seen[new_state][v] > new_cost: seen[new_state][v] = new_cost heapq.heappush(queue, (new_cost, new_state, v)) back_fix = fix # 順方向からの探索 fix = [MAX_VALUE] * N seen = [MAX_VALUE] * N queue = [] seen[0] = 0 heapq.heappush(queue, (0, 0)) while len(queue) > 0: cost, u = heapq.heappop(queue) if fix[u] < MAX_VALUE: continue fix[u] = cost for v, w in next_nodes[u]: if fix[v] == MAX_VALUE: new_cost = cost + w + C if seen[v] > new_cost: seen[v] = new_cost heapq.heappush(queue, (new_cost, v)) front_fix = fix for i in range(1, N): ans = front_fix[i] + min(back_fix[0][i], back_fix[1][i]) ans = min(ans, front_fix[N - 1]) print(ans) if __name__ == "__main__": main()