| import heapq |
| import sys |
| |
| def dijkstra(S,E,TERM): |
| INF = float('inf') |
| distance_list = [INF]*(N+1) |
| distance_list[S] = TERM |
| node_list = [] |
| heapq.heappush(node_list,(TERM,S)) |
| |
| while node_list: |
| cur_time,cur_node = heapq.heappop(node_list) |
| |
| for next_node in graph[cur_node]: |
| if time_spend_list.get((cur_node,next_node)) and time_spend_list[(cur_node,next_node)][0]<=cur_time<=time_spend_list[(cur_node,next_node)][1]: |
| spend_time = time_spend_list[(cur_node,next_node)][1] + graph[cur_node][next_node] |
| else: |
| spend_time = cur_time + graph[cur_node][next_node] |
| |
| if distance_list[next_node] > spend_time: |
| distance_list[next_node] = spend_time |
| heapq.heappush(node_list,(spend_time,next_node)) |
| |
| return distance_list |
| |
| |
| input = sys.stdin.readline |
| |
| N,M = map(int,input().split()) |
| |
| start_point,end_point,king_term,G = map(int,input().split()) |
| |
| king_visit_list = list(map(int,input().split())) |
| |
| |
| graph = [{} for _ in range(N+1)] |
| |
| for _ in range(M): |
| x,y,times = map(int,input().split()) |
| |
| graph[x][y] = min(graph[x].get(y,float('inf')),times) |
| graph[y][x] = min(graph[y].get(x,float('inf')),times) |
| |
| |
| |
| time_spend_list = {} |
| |
| king_time = 0 |
| for ind in range(G-1): |
| start,ends = king_visit_list[ind],king_visit_list[ind+1] |
| time_spend_list[(start,ends)] = (king_time,king_time+graph[start][ends]) |
| time_spend_list[(ends,start)] = (king_time,king_time+graph[start][ends]) |
| king_time += graph[start][ends] |
| |
| |
| result = dijkstra(start_point,end_point,king_term) |
| |
| |
| print(result[end_point]-king_term) |