#include <bits/stdc++.h>
using namespace std;
const int Maxn = 300005;
int rt[Maxn], val[Maxn], dep[Maxn], prt[Maxn], tag[Maxn];
vector<int> e[Maxn];
struct node {
  int ls, rs, dis;
  int val, tag, pos;
} w[Maxn];
struct worker {
  int son, prt, cost;
} p[Maxn];
void dfs1(int x, int fa) {
  prt[x] = fa;
  dep[x] = dep[fa] + 1;
  for (int y : e[x]) {
    if (y == fa) continue;
    dfs1(y, x);
    tag[x] += tag[y];
  }
}
void Add(int x, int val) {
  if (!x) return;
  w[x].tag += val;
  w[x].val += val;
}
void PushDown(int x) {
  Add(w[x].ls, w[x].tag);
  Add(w[x].rs, w[x].tag);
  w[x].tag = 0;
}
int Merge(int x, int y) {
  if (!x || !y) return x + y;
  PushDown(x);
  PushDown(y);
  if (w[x].val > w[y].val) swap(x, y);
  w[x].rs = Merge(w[x].rs, y);
  if (w[w[x].ls].dis < w[w[x].rs].dis) swap(w[x].ls, w[x].rs);
  w[x].dis = w[x].rs ? w[w[x].rs].dis + 1 : 0;
  return x;
}
long long dfs2(int x, int fa) {
  long long ans = 0;
  for (int y : e[x]) {
    if (y == fa) continue;
    ans += dfs2(y, x);
    rt[x] = Merge(rt[x], rt[y]);
  }
  while (w[rt[x]].pos >= dep[x]) rt[x] = Merge(w[rt[x]].ls, w[rt[x]].rs);
  ans += w[rt[x]].val;
  Add(rt[x], -w[rt[x]].val);
  return ans;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    e[x].push_back(y);
    e[y].push_back(x);
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &p[i].son, &p[i].prt, &p[i].cost);
    tag[p[i].son]++;
    tag[p[i].prt]--;
  }
  dfs1(1, 0);
  for (int i = 2; i <= n; i++)
    if (!tag[i]) {
      cout << "-1\n";
      return 0;
    }
  for (int i = 1; i <= m; i++) {
    w[i].val = p[i].cost;
    w[i].pos = dep[p[i].prt];
    rt[p[i].son] = Merge(rt[p[i].son], i);
  }
  cout << dfs2(1, 0) << "\n";
  return 0;
}
