import heapq
import math
def path_print(p, destination):
if p[destination] == destination:
print(destination, end = " ")
else:
path_print(p, p[destination])
print(destination, end = " ")
def dijkstra(graph, source):
v = len(graph)
d = [math.inf] * v
p = [None] * v
fop = [0] * v
heap = []
d[source] = 0
p[source] = source
heapq.heappush(heap, (d[source], source))
while len(heap) > 0:
distance, current_node = heapq.heappop(heap)
if fop[current_node] == 1:
continue
fop[current_node] = 1
for neighbor, cost in graph[current_node]:
if fop[neighbor] == 1:
continue
if d[neighbor] > d[current_node] + cost:
d[neighbor] = d[current_node] + cost
heapq.heappush(heap, (d[neighbor], neighbor))
p[neighbor] = current_node
path_print(p, 2)
graph = {
0: [(1, 2), (2, 10)],
1: [(2, 4)],
2: []
}
dijkstra(graph, 0)
aW1wb3J0IGhlYXBxCmltcG9ydCBtYXRoCgpkZWYgcGF0aF9wcmludChwLCBkZXN0aW5hdGlvbik6CiAgICBpZiBwW2Rlc3RpbmF0aW9uXSA9PSBkZXN0aW5hdGlvbjoKICAgICAgICBwcmludChkZXN0aW5hdGlvbiwgZW5kID0gIiAiKQogICAgZWxzZToKICAgICAgICBwYXRoX3ByaW50KHAsIHBbZGVzdGluYXRpb25dKQogICAgICAgIHByaW50KGRlc3RpbmF0aW9uLCBlbmQgPSAiICIpCiAgICAgICAgCgpkZWYgZGlqa3N0cmEoZ3JhcGgsIHNvdXJjZSk6CiAgICB2ID0gbGVuKGdyYXBoKQogICAgZCA9IFttYXRoLmluZl0gKiB2CiAgICBwID0gW05vbmVdICogdgogICAgZm9wID0gWzBdICogdgogICAgCiAgICBoZWFwID0gW10KICAgIAogICAgZFtzb3VyY2VdID0gMAogICAgcFtzb3VyY2VdID0gc291cmNlCiAgICAKICAgIGhlYXBxLmhlYXBwdXNoKGhlYXAsIChkW3NvdXJjZV0sIHNvdXJjZSkpCiAgICAKICAgIHdoaWxlIGxlbihoZWFwKSA+IDA6CiAgICAgICAgZGlzdGFuY2UsIGN1cnJlbnRfbm9kZSA9IGhlYXBxLmhlYXBwb3AoaGVhcCkKICAgICAgICAKICAgICAgICBpZiBmb3BbY3VycmVudF9ub2RlXSA9PSAxOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIAogICAgICAgIGZvcFtjdXJyZW50X25vZGVdID0gMQogICAgICAgIAogICAgICAgIGZvciBuZWlnaGJvciwgY29zdCBpbiBncmFwaFtjdXJyZW50X25vZGVdOgogICAgICAgICAgICAKICAgICAgICAgICAgaWYgZm9wW25laWdoYm9yXSA9PSAxOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIGRbbmVpZ2hib3JdID4gZFtjdXJyZW50X25vZGVdICsgY29zdDoKICAgICAgICAgICAgICAgIGRbbmVpZ2hib3JdID0gZFtjdXJyZW50X25vZGVdICsgY29zdAogICAgICAgICAgICAgICAgaGVhcHEuaGVhcHB1c2goaGVhcCwgKGRbbmVpZ2hib3JdLCBuZWlnaGJvcikpCiAgICAgICAgICAgICAgICBwW25laWdoYm9yXSA9IGN1cnJlbnRfbm9kZQogICAgCgogICAgcGF0aF9wcmludChwLCAyKQoKZ3JhcGggPSB7CiAgICAwOiBbKDEsIDIpLCAoMiwgMTApXSwKICAgIDE6IFsoMiwgNCldLAogICAgMjogW10KICAgIH0KCmRpamtzdHJhKGdyYXBoLCAwKQoK