#include <bits/stdc++.h>   using namespace std;   int read() {     char ch = getchar();     int f = 0, x = 1;     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) x = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) {       f = (f << 1) + (f << 3) + ch -  0 ;       ch = getchar();     }     return f * x;   }   int ch[2000005][2], fa[2000005], w[2000005], mark[2000005];   int f[2000005], top, s[2000005], n, k, m;   bool rev[2000005];   bool isroot(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }   void pushdown(int x) {     if (rev[x]) {       rev[ch[x][0]] ^= 1;       rev[ch[x][1]] ^= 1;       swap(ch[x][0], ch[x][1]);       rev[x] = 0;     }     if (mark[x]) {       mark[ch[x][0]] = min(mark[ch[x][0]], mark[x]);       mark[ch[x][1]] = min(mark[ch[x][1]], mark[x]);       w[ch[x][0]] = min(w[ch[x][0]], mark[x]);       w[ch[x][1]] = min(w[ch[x][1]], mark[x]);       mark[x] = 2000000000;     }   }   void rotate(int x) {     int y = fa[x], z = fa[y], l, r;     if (ch[y][0] == x)       l = 0;     else       l = 1;     r = l ^ 1;     if (!isroot(y)) {       if (ch[z][0] == y)         ch[z][0] = x;       else         ch[z][1] = x;     }     fa[y] = x;     fa[x] = z;     fa[ch[x][r]] = y;     ch[y][l] = ch[x][r];     ch[x][r] = y;   }   void splay(int x) {     top = 0;     s[++top] = x;     for (int i = x; !isroot(i); i = fa[i]) s[++top] = fa[i];     while (top) pushdown(s[top--]);     while (!isroot(x)) {       int y = fa[x], z = fa[y];       if (!isroot(y)) {         if (ch[z][0] == y ^ ch[y][0] == x)           rotate(x);         else           rotate(y);       }       rotate(x);     }   }   void access(int x) {     for (int t = 0; x; t = x, x = fa[x]) {       splay(x);       ch[x][1] = t;     }   }   void makeroot(int x) {     access(x);     splay(x);     rev[x] ^= 1;   }   void link(int x, int y) {     makeroot(x);     fa[x] = y;   }   int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }   void dfs(int x) {     if (ch[x][0] && !isroot(ch[x][0])) {       mark[ch[x][0]] = min(mark[ch[x][0]], mark[x]);       w[ch[x][0]] = min(w[ch[x][0]], mark[x]);       dfs(ch[x][0]);     }     if (ch[x][1] && !isroot(ch[x][1])) {       mark[ch[x][1]] = min(mark[ch[x][1]], mark[x]);       w[ch[x][1]] = min(w[ch[x][1]], mark[x]);       dfs(ch[x][1]);     }   }   int main() {     memset(w, 0x7f7f7f7f, sizeof(w));     memset(mark, 0x7f7f7f7f, sizeof(mark));     n = read();     k = read();     m = read();     for (int i = 1; i <= n; i++) {       f[i] = i;     }     for (int i = 1; i <= k; i++) {       int u = read(), v = read();       link(u, n + i);       link(n + i, v);       f[find(u)] = find(v);     }     for (int i = 1; i <= m; i++) {       int u = read(), v = read(), w1 = read();       int fu = find(u), fv = find(v);       if (fu == fv) {         makeroot(u);         access(v);         splay(v);         mark[v] = min(mark[v], w1);         w[v] = min(w[v], w1);       } else {         link(u, i + k + n);         link(i + k + n, v);         f[fu] = fv;       }     }     long long ans = 0;     for (int i = 1; i <= n + k + m; i++) {       if (isroot(i)) {         dfs(i);       }     }     for (int i = 1; i <= k; i++) {       if (w[i + n] >= 2000000000) {         puts( -1 );         return 0;       }       ans += w[i + n];     }     cout << ans;   }