#include using namespace std; #define rep(i,n) for(int i = 0; i < (n);i++) #define sz(x) int(x.size()) typedef long long ll; typedef pair P; struct UnionFind{ vector data; /* UnionFind(int sz) { data.assign(sz, -1); }*/ void make(int sz) { data.assign(sz, -1); } bool unite(int x, int y) { x = find(x), y = find(y); if(x == y) return (false); if(data[x] > data[y]) swap(x, y);//親は負でサイズを保存 data[x] += data[y]; data[y] = x; return (true); } int find(int k) { if(data[k] < 0) return (k); return (data[k] = find(data[k])); } bool same(int x, int y){ return find(x) == find(y); } int size(int k) { return (-data[find(k)]); } }; struct Edge{ll u,v; int cost;}; using Edges = vector; int n, m, k; UnionFind uf; bool comp(const Edge &a, const Edge &b){ return a.cost < b.cost; } ll res; void kruskal(Edges &es){ sort(es.begin(),es.end(),comp); for(auto e : es){ ll cost = e.cost; int u = e.u,v = e.v; if(!uf.same(u,v)){ uf.unite(u,v); res += cost; } } } int main(){ cin >> n >> m >> k; Edges es; uf.make(n); ll max_cost = 0; rep(i,m) { Edge e; cin >> e.u >> e.v >> e.cost; e.u--; e.v--; max_cost += e.cost; es.push_back(e); } rep(i,k) { int t; cin >> t; t--; uf.unite(es[t].u, es[t].v); res += es[t].cost; } kruskal(es); cout << max_cost - res << endl; return 0; }