다익스트라

 
from sys import stdin
 
N = int(stdin.readline())
L = int(stdin.readline())
INF = int(1e9)
 
graph = {n : [] for n in range(N+1)}
visit = [False for i in range(N+1)]
vertex = [INF for i in range(N+1)]
track = [-1 for i in range(N+1)]
 
for _ in range(L):
  s, e, cost = map(int, stdin.readline().split(" "))
  graph[s].append([e,cost])
 
start, end = map(int, stdin.readline().split(" "))
 
def retNextNode(visit, vertex):
  global N
  mincost = INF
  v = 0
  for i in range(1,N+1):
    if visit[i] == False and mincost > vertex[i]:
      mincost = vertex[i]
      v = i
  return v
 
 
def shortcut(s,e):
  global N, L
  
  visit[s] = True
  vertex[s] = 0
  
  for v in graph[s]:
    if 0+  v[1] < vertex[v[0]]:
      vertex[v[0]] = v[1]
  
  for j in range(1,N):
    nextNode = retNextNode(visit,vertex)
    visit[nextNode] = True
    for nn in graph[nextNode]:
      if vertex[nextNode] + nn[1] <= vertex[nn[0]]:
        vertex[nn[0]] = vertex[nextNode] + nn[1]
        track[nn[0]] = nextNode
  return track  
 
shortcut(start,end)
 
trace = [end]
pointer =end
while True:
  if track[pointer] == -1 or pointer ==start:
    break
  trace.append(track[pointer])
  pointer = track[pointer]
trace.append(start)
print(vertex[end])
print(len(trace))
trace.reverse()
print(*trace, sep=" ")