#include <bits/stdc++.h>
using namespace std;
const int N = 300005, M = 600005;
const long long INF = 0x3f3f3f3f3f3f3f3fll;
int n, m, u, v, c;
int fr[N], nxt[M], em[M], dep[N], fa[N], sf[N], dlt[N];
long long f[N];
struct node {
  int em, c;
};
bool operator<(node a, node b) { return a.c > b.c; }
priority_queue<node> q[N];
inline void addedge(int u, int v, int i) {
  nxt[i] = fr[u];
  fr[u] = i;
  em[i] = v;
}
inline void get(int &a) {
  char c = getchar();
  a = 0;
  for (; c < '0' || c > '9'; c = getchar())
    ;
  for (; c >= '0' && c <= '9'; c = getchar()) a = a * 10 + c - '0';
}
void dfs0(int d) {
  for (int j = fr[d]; j != 0; j = nxt[j])
    if (em[j] != fa[d]) {
      fa[em[j]] = d;
      dep[em[j]] = dep[d] + 1;
      dfs0(em[j]);
      sf[d] += sf[em[j]];
    }
}
void dfs(int d) {
  for (int j = fr[d]; j != 0; j = nxt[j])
    if (em[j] != fa[d]) {
      dfs(em[j]);
      f[d] += f[em[j]];
      if (q[d].size() < q[em[j]].size()) {
        q[d].swap(q[em[j]]);
        swap(dlt[d], dlt[em[j]]);
      }
      while (!q[em[j]].empty()) {
        q[d].push(
            (node){q[em[j]].top().em, q[em[j]].top().c - dlt[em[j]] + dlt[d]});
        q[em[j]].pop();
      }
    }
  while (!q[d].empty() && dep[q[d].top().em] >= dep[d]) q[d].pop();
  if (!q[d].empty()) {
    f[d] += q[d].top().c - dlt[d];
    dlt[d] += q[d].top().c - dlt[d];
  }
}
int main() {
  get(n);
  get(m);
  for (int i = 1; i < n; i++) {
    get(u);
    get(v);
    addedge(u, v, i * 2);
    addedge(v, u, i * 2 + 1);
  }
  for (int i = 1; i <= m; i++) {
    get(u);
    get(v);
    get(c);
    q[u].push((node){v, c});
    sf[u]++;
    sf[v]--;
  }
  dfs0(1);
  for (int i = 2; i <= n; i++)
    if (sf[i] == 0) {
      printf("-1\n");
      return 0;
    }
  dfs(1);
  printf("%lld\n", f[1]);
  return 0;
}
