#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const long long inf = 1e16;
const int N = 300030;
int head[N], nxt[N << 1], lst[N << 1];
int c[N], S[N], T[N], wh[N];
int n, m, tot, cnt;
long long tag[N << 2], mn[N << 2], F[N];
vector<int> add[N], del[N];
void insert(int x, int y) {
  lst[++tot] = y;
  nxt[tot] = head[x];
  head[x] = tot;
  lst[++tot] = x;
  nxt[tot] = head[y];
  head[y] = tot;
}
void dfs(int x, int f) {
  S[x] = cnt + 1;
  for (int i = 0; i < add[x].size(); i++) wh[add[x][i]] = ++cnt;
  for (int i = head[x]; i; i = nxt[i])
    if (lst[i] != f) dfs(lst[i], x);
  T[x] = cnt;
}
void change(int x, int L, int R, int p, long long f) {
  if (L == R) {
    mn[x] = f;
    return;
  }
  int mid = L + R >> 1;
  if (p <= mid)
    change(x << 1, L, mid, p, f);
  else
    change(x << 1 | 1, mid + 1, R, p, f);
  mn[x] = min(mn[x << 1], mn[x << 1 | 1]) + tag[x];
  mn[x] = min(mn[x], inf);
}
void change(int x, int L, int R, int l, int r, long long f) {
  if (L == l && R == r) {
    tag[x] = tag[x] + f;
    mn[x] = mn[x] + f;
    return;
  }
  int mid = L + R >> 1;
  if (r <= mid)
    change(x << 1, L, mid, l, r, f);
  else if (l > mid)
    change(x << 1 | 1, mid + 1, R, l, r, f);
  else
    change(x << 1, L, mid, l, mid, f),
        change(x << 1 | 1, mid + 1, R, mid + 1, r, f);
  mn[x] = min(mn[x << 1], mn[x << 1 | 1]) + tag[x];
  mn[x] = min(mn[x], inf);
}
long long query(int x, int L, int R, int l, int r) {
  if (L == l && R == r) return mn[x];
  int mid = L + R >> 1;
  if (r <= mid)
    return query(x << 1, L, mid, l, r) + tag[x];
  else if (l > mid)
    return query(x << 1 | 1, mid + 1, R, l, r) + tag[x];
  else
    return min(query(x << 1, L, mid, l, mid),
               query(x << 1 | 1, mid + 1, R, mid + 1, r)) +
           tag[x];
}
long long solve(int x, int f) {
  long long all = 0;
  for (int i = head[x]; i; i = nxt[i])
    if (lst[i] != f) {
      all += solve(lst[i], x);
      all = min(all, inf);
    }
  if (x == 1) return all;
  for (int i = 0; i < add[x].size(); i++)
    change(1, 1, m, wh[add[x][i]], all + c[add[x][i]]);
  for (int i = 0; i < del[x].size(); i++) change(1, 1, m, wh[del[x][i]], inf);
  for (int i = head[x]; i; i = nxt[i])
    if (lst[i] != f && S[lst[i]] <= T[lst[i]])
      change(1, 1, m, S[lst[i]], T[lst[i]], all - F[lst[i]]);
  return F[x] = (S[x] <= T[x] ? query(1, 1, m, S[x], T[x]) : inf);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    insert(x, y);
  }
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d%d", &x, &y, &c[i]);
    add[x].push_back(i);
    del[y].push_back(i);
  }
  dfs(1, 0);
  long long ans = solve(1, 0);
  if (ans >= inf) ans = -1;
  cout << ans << endl;
  return 0;
}
