#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5;
struct Node {
  pair<long long, int> x;
  long long tg;
  int l, r, d;
} t[N];
int n, m, tot, dep[N], rt[N];
long long f[N], ans;
vector<int> to[N];
vector<pair<long long, int> > g[N];
void add(int x, long long v) {
  t[x].x.first += v;
  t[x].tg += v;
}
void pushdown(int x) {
  if (t[x].tg) {
    if (t[x].l) add(t[x].l, t[x].tg);
    if (t[x].r) add(t[x].r, t[x].tg);
    t[x].tg = 0;
  }
}
int merge(int x, int y) {
  if (!x || !y) return x | y;
  if (t[x].x > t[y].x) swap(x, y);
  pushdown(x);
  t[x].r = merge(t[x].r, y);
  if (t[t[x].r].d > t[t[x].l].d) swap(t[x].l, t[x].r);
  t[x].d = t[t[x].r].d + 1;
  return x;
}
void dfs(int x, int pre) {
  dep[x] = dep[pre] + 1;
  for (auto y : g[x]) t[++tot].x = y, t[tot].d = 1, rt[x] = merge(rt[x], tot);
  long long s = 0;
  for (auto y : to[x])
    if (y ^ pre) {
      dfs(y, x);
      s += f[y];
      add(rt[y], -f[y]);
      rt[x] = merge(rt[x], rt[y]);
    }
  add(rt[x], s);
  while (rt[x] && dep[t[rt[x]].x.second] >= dep[x])
    pushdown(rt[x]), rt[x] = merge(t[rt[x]].l, t[rt[x]].r);
  if (!rt[x]) cout << -1 << endl, exit(0);
  f[x] = t[rt[x]].x.first;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 1; i < n; ++i) {
    int x, y;
    cin >> x >> y;
    to[x].push_back(y), to[y].push_back(x);
  }
  for (int i = 1; i <= m; ++i) {
    int x, y, z;
    cin >> x >> y >> z;
    g[x].push_back(make_pair(z, y));
  }
  dep[1] = 1;
  for (auto y : to[1]) dfs(y, 1), ans += f[y];
  cout << ans << endl;
  return 0;
}
