#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300000 + 5;
struct Path {
  long long w, tag;
  int ls, rs, tp, d;
} pth[MAXN];
int n, m, rt[MAXN];
bool flag = true, out[MAXN];
vector<int> e[MAXN];
void cover(int x, long long delta) {
  if (!x) return;
  pth[x].w += delta, pth[x].tag += delta;
}
void pushdown(int x) {
  cover(pth[x].ls, pth[x].tag);
  cover(pth[x].rs, pth[x].tag);
  pth[x].tag = 0;
}
int merge(int x, int y) {
  if (!x || !y) return x + y;
  if (pth[x].w > pth[y].w) swap(x, y);
  pushdown(x);
  pth[x].rs = merge(pth[x].rs, y);
  if (pth[pth[x].ls].d < pth[pth[x].rs].d) swap(pth[x].ls, pth[x].rs);
  pth[x].d = pth[pth[x].rs].d + 1;
  return x;
}
bool getmin(int &rt) {
  while (rt && out[pth[rt].tp])
    pushdown(rt), rt = merge(pth[rt].ls, pth[rt].rs);
  return rt;
}
void dfs(int x, int fa) {
  long long tot = 0;
  for (int i = 0; i < e[x].size(); i++) {
    int to = e[x][i];
    if (to == fa) continue;
    dfs(to, x);
    if (!getmin(rt[to])) flag = false;
    if (!flag) return;
    tot += pth[rt[to]].w;
  }
  for (int i = 0; i < e[x].size(); i++) {
    int to = e[x][i];
    if (to == fa) continue;
    cover(rt[to], tot - pth[rt[to]].w);
  }
  cover(rt[x], tot);
  for (int i = 0; i < e[x].size(); i++) {
    int to = e[x][i];
    if (to == fa) continue;
    rt[x] = merge(rt[x], rt[to]);
  }
  out[x] = true;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1, x, y; i < n; i++) {
    scanf("%d%d", &x, &y);
    e[x].push_back(y), e[y].push_back(x);
  }
  for (int i = 1, x; i <= m; i++) {
    scanf("%d%d%lld", &x, &pth[i].tp, &pth[i].w);
    pth[i].d = 1;
    rt[x] = merge(rt[x], i);
  }
  dfs(1, 0);
  printf("%lld\n", flag ? pth[rt[1]].w * (int)(n > 1) : -1);
  return 0;
}
