#include #include #include #include using namespace std; const int MAXN = 100100; int ans, n, m, k, i, x, y, z, v, to, cs, qq; bool a[MAXN]; vector > g[MAXN]; int d[MAXN]; set > s; int l[MAXN]; inline int gt(int x) { if (l[x] < qq) d[x] = 1e9; l[x] = qq; return d[x]; } inline void upd(int x, int y) { l[x] = qq; d[x] = y; } int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= k; i++) { scanf("%d", &x); a[x] = 1; } for (int i = 1; i <= m; i++) { scanf("%d%d%d", &x, &y, &z); g[x].push_back(make_pair(y, z)); g[y].push_back(make_pair(x, z)); } ans = 1e9; for (int i = 1; i <= n; i++) { if (!a[i]) continue; qq++; upd(i, 0); s.clear(); s.insert(make_pair(0, i)); int cn = 0; while (!s.empty()) { if (s.begin()->first > ans) break; v = s.begin()->second, s.erase(s.begin()); if (a[v]) { cn++; if (cn > 1) { ans = min(ans, gt(v)); break; } } for (int i = 0; i < g[v].size(); i++) { to = g[v][i].first; cs = g[v][i].second; if (gt(v) + cs < gt(to)) { s.erase(make_pair(gt(to), to)); upd(to, gt(v) + cs); s.insert(make_pair(gt(to), to)); } } } } printf("%d\n", ans); return 0; }