#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(x) begin(x), end(x)
#define len(x) int((x).size())
template <class T>
inline bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  } else {
    return false;
  }
}
template <class T>
inline bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  } else {
    return false;
  }
}
constexpr int N = 1e5 + 5, M = 3e5 + 5, K = 25;
int n, m, k, sz[N];
ll new_sz[K];
tuple<int, int, int> e_old[M];
pair<int, int> e_new[K];
struct Dsu {
  int f[N], s[N];
  void init(int n) {
    iota(f + 1, f + n + 1, 1);
    fill_n(s + 1, n, 1);
  }
  int fd(int x) {
    while (x != f[x]) x = f[x] = f[f[x]];
    return x;
  }
  bool mg(int x, int y) {
    x = fd(x), y = fd(y);
    if (x == y) {
      return false;
    } else {
      if (s[x] > s[y]) swap(x, y);
      f[x] = y, s[y] += s[x];
      return true;
    }
  }
} dsu;
void simpl() {
  sort(e_old, e_old + m);
  dsu.init(n);
  int new_m = 0;
  for (int i = 0; i < m; ++i) {
    auto [w, u, v] = e_old[i];
    if (dsu.mg(u, v)) e_old[new_m++] = e_old[i];
  }
  m = new_m;
  dsu.init(n);
  for (int i = 0; i < k; ++i) {
    auto [u, v] = e_new[i];
    dsu.mg(u, v);
  }
  static bool essential[N];
  for (int i = 0; i < m; ++i) {
    auto [w, u, v] = e_old[i];
    essential[i] = dsu.mg(u, v);
  }
  dsu.init(n);
  for (int i = 0; i < m; ++i) {
    auto [w, u, v] = e_old[i];
    if (essential[i]) dsu.mg(u, v);
  }
  static int id[N];
  int new_n = 0;
  for (int i = 1; i <= n; ++i) {
    if (dsu.f[i] == i) id[i] = ++new_n;
  }
  for (int i = 1; i <= n; ++i) {
    new_sz[id[dsu.fd(i)]] += sz[i];
  }
  n = new_n;
  new_m = 0;
  for (int i = 0; i < m; ++i) {
    auto [w, u, v] = e_old[i];
    if (!essential[i]) e_old[new_m++] = {w, id[dsu.fd(u)], id[dsu.fd(v)]};
  }
  m = new_m;
  for (int i = 0; i < k; ++i) {
    auto &[u, v] = e_new[i];
    u = id[dsu.fd(u)], v = id[dsu.fd(v)];
  }
  // cerr << "n = " << n << "\n";
  // for (int i = 1; i <= n; ++i)
  //   cerr << "new_sz[" << i << "] = " << new_sz[i] << "\n";
  // cerr << "m = " << m << "\n";
  // for (int i = 0; i < m; ++i) {
  //   auto [w, u, v] = e_old[i];
  //   cerr << "e_old[" << i << "] = (" << w << ", " << u << ", " << v << ")\n";
  // }
  // cerr << "k = " << k << "\n";
  // for (int i = 0; i < k; ++i) {
  //   auto [u, v] = e_new[i];
  //   cerr << "e_new[" << i << "] = (" << u << ", " << v << ")\n";
  // }
  assert(m == n - 1);
  assert(n <= k + 1);
}
vector<int> adj[K];
void ae(int u, int v) { adj[u].push_back(v), adj[v].push_back(u); }
int lim[K], fa[K];
ll sum[K];
int ti, dfn[K];
void dfsInfo(int u, int p) {
  fa[u] = p, sum[u] = new_sz[u];
  dfn[u] = ++ti;
  for (int v : adj[u]) {
    if (v != p) {
      dfsInfo(v, u);
      sum[u] += sum[v];
    }
  }
}
void upd(int u, int v, int w) {
  for (; u != v; u = fa[u]) {
    if (dfn[u] < dfn[v]) swap(u, v);
    chmin(lim[u], w);
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cin.exceptions(ios::failbit);
  cin >> n >> m >> k;
  for (int i = 0; i < m; ++i) {
    auto &[w, u, v] = e_old[i];
    cin >> u >> v >> w;
  }
  for (int i = 0; i < k; ++i) {
    auto &[u, v] = e_new[i];
    cin >> u >> v;
  }
  for (int i = 1; i <= n; ++i) cin >> sz[i];
  simpl();
  ll ans = 0;
  for (int s = 0; s < (1 << k); ++s) {
    dsu.init(n);
    for (int i = 1; i <= n; ++i) adj[i].clear();
    for (int i = 0; i < k; ++i) {
      if ((s >> i & 1) == 1) {
        auto [u, v] = e_new[i];
        dsu.mg(u, v);
        ae(u, v);
      }
    }
    static bool tree[K];
    for (int i = 0; i < m; ++i) {
      auto [w, u, v] = e_old[i];
      if ((tree[i] = dsu.mg(u, v))) ae(u, v);
    }
    ti = 0;
    dfsInfo(1, 0);
    memset(lim, 0x3f, sizeof lim);
    for (int i = 0; i < m; ++i) {
      auto [w, u, v] = e_old[i];
      if (!tree[i]) upd(u, v, w);
    }
    ll cur = 0;
    for (int i = 0; i < k; ++i) {
      if ((s >> i & 1) == 1) {
        auto [u, v] = e_new[i];
        if (u == fa[v]) {
          swap(u, v);
        }
        cur += sum[u] * lim[u];
      }
    }
    chmax(ans, cur);
  }
  cout << ans << "\n";
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |