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);
        }
    }
}