#include <bits/stdc++.h>
using namespace std;
const long long N = 300005;
long long n, m;
struct qq {
  long long x, y, last;
} e[N * 2];
long long num, last[N];
void init(long long x, long long y) {
  num++;
  e[num].x = x;
  e[num].y = y;
  e[num].last = last[x];
  last[x] = num;
}
long long top[N];
long long w[N];
long long d[N];
long long r[N], l[N];
long long lazy[N];
long long root[N];
void change(long long x, long long y) {
  lazy[x] += y;
  w[x] += y;
}
void push_down(long long x) {
  if (l[x] != 0) change(l[x], lazy[x]);
  if (r[x] != 0) change(r[x], lazy[x]);
  lazy[x] = 0;
}
long long Merge(long long x, long long y) {
  if (x == 0 || y == 0) return x ^ y;
  if (w[x] > w[y]) swap(x, y);
  push_down(x);
  r[x] = Merge(r[x], y);
  if (d[r[x]] > d[l[x]]) swap(l[x], r[x]);
  d[x] = d[r[x]] + 1;
  return x;
}
long long ans = 0;
bool vis[N];
void dfs(long long x, long long fa) {
  for (long long u = last[x]; u != -1; u = e[u].last) {
    long long y = e[u].y;
    if (y == fa) continue;
    dfs(y, x);
    root[x] = Merge(root[x], root[y]);
  }
  if (x == 1) return;
  vis[x] = true;
  while (vis[top[root[x]]]) {
    push_down(root[x]);
    root[x] = Merge(r[root[x]], l[root[x]]);
  }
  if (root[x] == 0) {
    printf("-1\n");
    exit(0);
  }
  ans = ans + w[root[x]];
  change(root[x], -w[root[x]]);
}
int main() {
  memset(vis, false, sizeof(vis));
  num = 0;
  memset(last, -1, sizeof(last));
  scanf("%I64d%I64d", &n, &m);
  for (long long u = 1; u < n; u++) {
    long long x, y;
    scanf("%I64d%I64d", &x, &y);
    init(x, y);
    init(y, x);
  }
  for (long long u = 1; u <= m; u++) {
    long long x;
    scanf("%I64d%I64d%I64d", &x, &top[u], &w[u]);
    root[x] = Merge(root[x], u);
  }
  dfs(1, 0);
  printf("%I64d\n", ans);
  return 0;
}
