#include using namespace std; #define int long long int n, m, k; int tot = 0; struct Edge { int u, v, w; bool operator<(Edge R) { return w < R.w; } } e[114514]; int cnt; int fa[114514]; int h[114514]; int siz[114514]; void init(int n) { cnt = n; for (int i = 1; i <= n; ++i) { fa[i] = i; siz[i] = 1; h[i] = 0; // 初始化h数组 } } int find(int u) { if (fa[u] == u) return u; return fa[u] = find(fa[u]); } void merge(int u, int v) { u = find(u); v = find(v); if (u == v) return; if (h[u] < h[v]) { fa[u] = v; } else { fa[v] = u; if (h[u] == h[v]) h[u]++; } cnt--; } long long kur(int n, int m) { // 修正:从索引1开始排序,共m条边 sort(e + 1, e + m + 1); init(n); // 每次调用kur都要重新初始化并查集 long long sum = 0; for (int i = 1; i <= m; ++i) // 从1开始遍历 { int u = e[i].u, v = e[i].v; if (find(u) == find(v)) { continue; } merge(u, v); sum += e[i].w; } return (cnt > 1 ? -1 : sum); } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> k; // 读取所有边 for (int i = 1; i <= m; ++i) { int a, b, c; cin >> a >> b >> c; e[i] = {a, b, c}; } // 标记必须保留的边 for (int i = 1; i <= k; ++i) { int x; cin >> x; e[x].w = 0; // 将必须保留的边权重设为0 } // 计算总权重 int sumw = 0; for (int i = 1; i <= m; ++i) { sumw += e[i].w; } // 计算最小生成树的权重 long long mst = kur(n, m); // 输出可删除的最大权重 cout << sumw - mst << endl; return 0; }