import java.util.Comparator; import java.util.HashSet; import java.util.PriorityQueue; import java.util.Scanner; public class Main { // 当前节点的邻接边 private static HashSet<Edge>[] adj; // 当前节点是否有车 private static int[] hasBike; // 骑车或走路情况下 从起点1到达当前节点所需的最少时间 private static long[][] cost; public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ solution(in); } } /** * 模拟法: dijkstra * @param in */ private static void solution(Scanner in){ // 点数 int V = in.nextInt(); // 边数 int E = in.nextInt(); // 构建图 点的范围[1:V] adj = new HashSet[V+1]; for(int i=1; i<=V; i++){ adj[i] = new HashSet<>(); } int u,v,w; for(int i=1; i<=E; i++){ u = in.nextInt(); v = in.nextInt(); w = in.nextInt(); adj[u].add(new Edge(v, w)); adj[v].add(new Edge(u, w)); } int k = in.nextInt(); hasBike = new int[V+1]; for(int i=1; i<=k; i++){ hasBike[in.nextInt()] = 1; } // init cost = new long[2][V+1]; for(int i=0; i<=1; i++){ for(int j=1; j<=V; j++){ cost[i][j] = Long.MAX_VALUE; } } System.out.println(dijkstra(V)); } /** * dijkstra * @param terminal * @return */ private static long dijkstra(int terminal){ // 最小堆(到达当前节点所需的时间) PriorityQueue<Node> queue = new PriorityQueue<>(); // init queue.offer(new Node(1, 0, hasBike[1])); cost[hasBike[1]][1] = 0; while(!queue.isEmpty()){ Node curr = queue.poll(); if(curr.vertex == terminal){ return curr.cost; } long time; int biked; for(Edge e: adj[curr.vertex]){ // 骑车 if(curr.biked == 1){ time = curr.cost + e.weight/2; } // 走路 else{ time = curr.cost + e.weight; } // 能骑则骑 biked = (curr.biked | hasBike[e.vertex]); if(time < cost[biked][e.vertex]){ cost[biked][e.vertex] = time; queue.offer(new Node(e.vertex, time, biked)); } } } return -1; } private static class Edge{ int vertex; int weight; public Edge(int vertex, int weight){ this.vertex = vertex; this.weight = weight; } } private static class Node implements Comparable<Node>{ // 当前节点编号 int vertex; // 从起点1到达当前节点所需的最少时间 long cost; // 是否骑车 int biked; public Node(int vertex, long cost, int biked){ this.vertex = vertex; this.cost = cost; this.biked = biked; } @Override public int compareTo(Node o){ return (int) (this.cost-o.cost); } } }