#include using namespace std; using i64 = int64_t; using vi = vector; using vvi = vector; struct edge { int s, t, c; }; vi par; int find(int x) { if (x == par[x]) return x; return par[x] = find(par[x]); } bool unite(int x, int y) { x = find(x); y = find(y); if (x == y) return true; par[x] = y; return false; } int main() { int n, m, k; cin >> n >> m >> k; par = vi(n); iota(par.begin(), par.end(), 0); vector edges; for (int i = 0; i < m; i++) { int a, b, c; cin >> a >> b >> c; a--; b--; edges.push_back({a, b, c}); } set used; for (int i = 0; i < k; i++) { int e; cin >> e; e--; used.insert(1e9 * edges[e].s + edges[e].t); unite(edges[e].s, edges[e].t); } i64 ans = 0; sort(edges.begin(), edges.end(), [&](edge a, edge b) { return a.c < b.c; }); for (int i = 0; i < m; i++) { if (used.count(1e9 * edges[i].s + edges[i].t)) continue; if (unite(edges[i].s, edges[i].t)) { ans += edges[i].c; } } cout << ans << endl; }