#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int inf = LONG_LONG_MAX;
tuple<int, int, int> solve (vector<vector<pair<int, int>>> a, vector<int> s, int n) {
vector<pair<int, int>> dist(n, {inf, -1});
int ans = inf, A = -1, B = -1;
set<pair<int, int>> st;
for (int i : s) dist[i] = {0, i}, st.emplace(0, i);
while (st.size()) {
auto [d_v, v] = *st.begin();
st.erase(st.begin());
for (auto [u, w] : a[v]) {
int nx = d_v + w;
if (nx < dist[u].first) {
st.erase({dist[u].first, u});
dist[u].first = nx, dist[u].second = dist[v].second;
st.emplace(dist[u].first, u);
}
}
}
for (int i = 0; i < n; i++) {
for (auto [j, w] : a[i]) {
if (~dist[i].second && ~dist[j].second && dist[i].second != dist[j].second) {
if (dist[i].first + dist[j].first + w < ans) ans = dist[i].first + dist[j].first + w, tie(A, B) = make_pair(dist[i].second, dist[j].second);
}
}
}
return {A, B, ans};
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n, m, k, ANS = inf;
cin >> n >> m >> k;
vector<vector<pair<int, int>>> a(n), aa(n);
for (int i = 0; i < m; i++) {
int x, y, w;
cin >> x >> y >> w, --x, --y;
a[x].emplace_back(y, w);
a[y].emplace_back(x, w);
}
vector<int> s(k);
for (int &i: s) cin >> i, --i;
auto [A, B, ans] = solve(a, s, n);
s.erase(find(s.begin(), s.end(), A));
s.erase(find(s.begin(), s.end(), B));
auto [C, D, ans2] = solve(a, s, n);
if (ans != inf && ans2 != inf) ANS = min(ANS, ans + ans2);
// cout << ANS << '\n';
// cout << A + 1 << ' ' << B + 1 << ' ' << C + 1 << ' ' << D + 1 << '\n';
auto get = [&] (int st) {
vector<int> dist(n, inf);
dist[st] = 0;
set<pair<int, int>> q;
q.emplace(0, st);
while (q.size()) {
auto [d_v, v] = *q.begin();
q.erase(q.begin());
for (auto [u, w] : a[v]) {
int nx = d_v + w;
if (nx < dist[u]) {
q.erase({dist[u], u});
dist[u] = nx;
q.emplace(dist[u], u);
}
}
}
return dist;
};
auto da = get(A);
auto db = get(B);
set<pair<int, int>> opt;
for (int i = 0; i < n; i++) opt.emplace(da[i], i);
opt.erase({da[B], B});
opt.erase({da[A], A});
for (int i = 0; i < n; i++) {
if (i == B || i == A) continue;
opt.erase({da[i], i});
if (opt.size() && opt.begin()->first != inf && db[i] != inf) ANS = min(ANS, db[i] + opt.begin()->first);
opt.emplace(da[i], i);
}
cout << ANS << '\n';
return 0;
}