// 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;
}