1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 const int inf = 1<<30;
6 int map1[1005][1005];
7 int T, S, D, n=0;
8 int d[1005];
9 bool vis[1005];
10 int a[1005];
11 void dij(int x)
12 {
13 for(int i=0; i<=n; i++)
14 {
15 d[i]=map1[0][i];
16 }
17 memset(vis, 0, sizeof(vis));
18 vis[0]=1;
19 for(int i=1; i<=n; i++)
20 {
21 int u, mini=inf;
22 for(int j=1; j<=n; j++)
23 {
24 if(!vis[j]&&d[j]<mini)
25 {
26 mini=d[j];
27 u=j;
28 }
29 }
30 vis[u]=1;
31 for(int v=1; v<=n; v++)
32 {
33 if(!vis[v]) d[v]=min(d[v], d[u]+map1[u][v]);
34 }
35 }
36 }
37 int main()
38 {
39 while(scanf("%d%d%d", &T, &S, &D)!=EOF)
40 {
41 for(int i=0; i<1005; i++)
42 {
43 for(int j=0; j<1005; j++)
44 {
45 map1[i][j]=(i==j?0:inf);
46 }
47 }
48 for(int i=0; i<T; i++)
49 {
50 int x, y, z;
51 scanf("%d %d %d", &x, &y, &z);
52 n=max(max(x, y), n);
53 if(z<map1[x][y]) map1[x][y]=map1[y][x]=z;
54 }
55 for(int i=0; i<S; i++)
56 {
57 int x;
58 scanf("%d", &x);
59 n=max(n, x);
60 map1[x][0]=map1[0][x]=0;
61 }
62 for(int i=0; i<D; i++)
63 {
64 scanf("%d", &a[i]);
65 }
66 dij(0);
67 int x=inf;
68 for(int i=0; i<D; i++)
69 {
70 x=min(x, d[a[i]]);
71 }
72 cout <<x<<endl;
73 n=0;
74 }
75
76 return 0;
77 }