OIG XVI - cie

// https://szkopul.edu.pl/problemset/problem/JwEKCYXo1NEJxjHOpsrKOKRm/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

#define int long long

constexpr int sizik = 500 * 1001, sizik2 = 200 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

int n, m;
// ar<int, 3> comp[sizik];
typedef ar<int, 3> Trio;
std::vector<Trio> comp;
int sp[sizik2];
int ans = 0, akt = 0;

int rep[sizik2], l[sizik2];
void build() {
    for (int i = 1; i <= n; i++) {
        rep[i] = i;
        l[i] = sp[i];
    }
}

bool local_sign(int a) {
    return a <= 0;
}

int Find(int a) {
    if (rep[a] != a) rep[a] = Find(rep[a]);
    return rep[a];
}

void Union(int a, int b) {
    int na = Find(a), nb = Find(b);

    if (na == nb) return;

    // new rep ~> nb

    rep[na] = nb;
    if (local_sign(l[na]) ^ local_sign(l[nb]) == 1) {
        ans += akt * std::min(abs(l[na]), abs(l[nb]));
    }

    l[nb] += l[na];
}

void solve() {
    std::cin >> n >> m;

    for (int i = 0; i < m; i++) {
        int a, b, c;
        std::cin >> a >> b >> c;
        comp.push_back({a, b, c});
    }

    std::sort(comp.begin(), comp.end(), [](const Trio& a, const Trio& b) { return a[2] < b[2]; });

    int k;
    std::cin >> k;

    for (int i = 0; i < k; i++) {
        int a;
        std::cin >> a;

        sp[a] = 1;
    }

    for (int i = 0; i < k; i++) {
        int a;
        std::cin >> a;

        sp[a] = -1;
    }

    build();

    for (const auto& [a, b, c] : comp) {
        akt = c;
        Union(a, b);
    }

    std::cout << ans << '\n';
}

int32_t main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}