'''
def dijsktra(n,m,edge,start,end):
num = [[float('inf')]*(n+1) for i in range(n+1)]
# 构造邻接矩阵
for i ,j,k in edge:
num[i][j] = k
visit = [False]*(n+1)
mindis = [float('inf')]*(n+1)
mindis[start] = 0
for i in range(1,n+1):
mini = float('inf')
cur = -1
for j in range(1,n+1):
if visit[j] == False and mindis[j]<mini:
mini = mindis[j]
cur = j
if cur == -1:
break
visit[cur] = True
for k in range(1,n+1):
if visit[k]== False and num[cur][k] != float('inf') and num[cur][k]+mindis[cur]<mindis[k]:
mindis[k] = num[cur][k] +mindis[cur]
return -1 if mindis[end] == float('inf') else mindis[end]
n,m = map(int,input().split())
num = []
for i in range(m):
num.append(list(map(int,input().split())))
print(dijsktra(n,m,num,1,n))
'''
import heapq
class Edge:
def __init__(self,to,val):
self.to = to
self.val = val
def dijkstra(start,end,edge,n,m):
grap = [[] for i in range(n+1)]
for i,j,k in edge:
grap[i].append(Edge(j,k))
visit = [False]*(n+1)
minDist = [float('inf')]*(n+1)
hp = []
heapq.heappush(hp,(0,start)) # 以第一个元素的大小进行压堆,默认小顶堆
minDist[start] = 0
while hp:
cur_dist ,cur_node = heapq.heappop(hp) # 把当前距离最小的节点拿出来
if visit[cur_node]:
continue
visit[cur_node] = True
for a in grap[cur_node]:
if visit[a.to] == False and cur_dist + a.val < minDist[a.to]:
minDist[a.to] = cur_dist + a.val
heapq.heappush(hp,(minDist[a.to],a.to)) # 存储到当前节点的最小距离
return -1 if minDist[end] == float('inf') else minDist[end]
n,m = map(int,input().split())
edge = [tuple(map(int,input().split())) for i in range(m)]
start = 1
end = n
result = dijkstra(start,end,edge,n,m)
print(result)
10-08
6909
