#include #include #include #include using namespace std; int find(int x, vector& p) { if(p[x] != x) p[x] = find(p[x], p); return p[x]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; int vir = n;//虚拟节点 n++; vector> edges; vector p(n); for (int i = 0; i < n - 1; i++) { cin >> p[i]; edges.push_back(make_tuple(vir, i, p[i])); } for(int i = 0; i < m; i++){ int a, b, w; cin >> a >> b >> w; edges.push_back(make_tuple(a, b, w)); } auto cmp = [](const tuple& a, const tuple& b) { return get<2>(a) < get<2>(b); }; sort(edges.begin(), edges.end(), cmp); for(int i = 0; i < n; i++) { p[i] = i; } int mins = 0; int used = 0; for(int i = 0; i < edges.size(); i++) { int u = get<0>(edges[i]); int v = get<1>(edges[i]); int w = get<2>(edges[i]); int pu = find(u, p); int pv = find(v, p); if(pu != pv) { p[pu] = pv; mins += w; used++; if(used == n - 1) break; } } cout << mins << endl; return 0; }