/* Name: 最短路(bellmanFord) Copyright: Author: Try_86 Date: 12/04/12 12:42 Description: 对每个起始点运行一次bellmanFord,求最短路 */ #include <cstdio> #include <iostream> using namespace std; const int N = 1005; const int M = 500500; const int MAX = 1000000000; int dis[N], ss[N], ds[N]; struct edge { int u; int v; int w; }e[M]; void init(int vs, int s) { for (int i=1; i<=vs; ++i) dis[i] = MAX; dis[s] = 0; return ; } void relax(int u, int v, int w) { if (dis[v] > dis[u] + w) dis[v] = dis[u] + w; return ; } void bellmanFord(int es, int vs, int s) { init(vs, s); for (int i=1; i<vs; ++i) { for (int j=0; j<es; ++j) relax(e[j].u, e[j].v, e[j].w); } return ; } int main() { int t, s, d; while (scanf("%d%d%d", &t, &s, &d) != EOF) { int vs = 0; for (int i=0; i<t; ++i) { scanf ("%d%d%d", &e[i].u, &e[i].v, &e[i].w); e[i+t].v = e[i].u; e[i+t].u = e[i].v; e[i+t].w = e[i].w; if (vs < e[i].u) vs = e[i].u; if (vs < e[i].v) vs = e[i].v; } for (int i=0; i<s; ++i) scanf ("%d", &ss[i]); for (int i=0; i<d; ++i) scanf ("%d", &ds[i]); int mins = MAX; for (int i=0; i<s; ++i) { bellmanFord(t<<1, vs, ss[i]); for (int j=0; j<d; ++j) { if (mins > dis[ds[j]]) mins = dis[ds[j]]; } } printf ("%d\n", mins); } return 0; }