#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> g[500010];
int rad[2][500010], tata[500010], niv[500010];
char in[500010], vaz[500010], tip[500010];
struct edge {
  int x, y, c;
};
edge v[500010];
int radacina(int x, int t) {
  int y = x;
  while (y != rad[t][y]) y = rad[t][y];
  while (rad[t][x] != y) {
    int aux = rad[t][x];
    rad[t][x] = y;
    x = aux;
  }
  return y;
}
void unite(int x, int y) {
  x = radacina(x, 0);
  y = radacina(y, 0);
  rad[0][x] = y;
}
void dfs(int nod) {
  vaz[nod] = 1;
  for (int i = 0; i < g[nod].size(); i++) {
    int vec = g[nod][i].first;
    if (vaz[vec] == 1) continue;
    niv[vec] = niv[nod] + 1;
    tata[vec] = nod;
    tip[vec] = g[nod][i].second;
    dfs(vec);
  }
}
int main() {
  int n, k, m, x, y;
  long long sol = 0;
  scanf("%d%d%d", &n, &k, &m);
  for (int i = 1; i <= n; i++) rad[0][i] = rad[1][i] = i;
  for (int i = 1; i <= k; i++) {
    scanf("%d%d", &x, &y);
    unite(x, y);
    g[x].push_back({y, 1});
    g[y].push_back({x, 1});
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &v[i].x, &v[i].y, &v[i].c);
    if (radacina(v[i].x, 0) != radacina(v[i].y, 0)) {
      unite(v[i].x, v[i].y);
      in[i] = 1;
      g[v[i].x].push_back({v[i].y, 0});
      g[v[i].y].push_back({v[i].x, 0});
    }
  }
  dfs(1);
  tata[1] = 1;
  int nr = 0;
  for (int i = 1; i <= m; i++) {
    if (in[i] == 1) continue;
    x = v[i].x;
    y = v[i].y;
    x = radacina(x, 1);
    y = radacina(y, 1);
    while (x != y) {
      if (niv[x] < niv[y]) swap(x, y);
      sol += tip[x] * v[i].c;
      nr += tip[x];
      rad[1][x] = tata[x];
      x = radacina(x, 1);
    }
  }
  if (nr < k)
    printf("-1");
  else
    printf("%I64d", sol);
  return 0;
}
