#include <bits/stdc++.h>
using namespace std;
const long long INF = 3e14 + 1;
int n, m, now, dn[300300], up[300300], c[300300], owp[300300];
long long f[300300];
vector<int> G[300300];
vector<pair<int, int> > d[300300];
vector<int> e[300300];
namespace Sgt {
long long mi[300300 << 2], tg[300300 << 2];
inline void add(int p, long long w) { mi[p] += w, tg[p] += w; }
inline void pushdown(int p) {
  if (!tg[p]) return;
  add((p << 1), tg[p]);
  add((p << 1 | 1), tg[p]);
  tg[p] = 0;
}
inline void pushup(int p) {
  mi[p] = (mi[(p << 1)] < mi[(p << 1 | 1)]) ? mi[(p << 1)] : mi[(p << 1 | 1)];
}
void build(int l = 1, int r = m, int p = 1) {
  if (l == r) return mi[p] = c[l], void();
  int mid = (l + r) >> 1;
  build(l, mid, (p << 1));
  build(mid + 1, r, (p << 1 | 1));
  pushup(p);
}
void modify(int L, int R, long long w, int l = 1, int r = m, int p = 1) {
  if (L <= l && r <= R) return add(p, w);
  int mid = (l + r) >> 1;
  pushdown(p);
  if (L <= mid) modify(L, R, w, l, mid, (p << 1));
  if (mid < R) modify(L, R, w, mid + 1, r, (p << 1 | 1));
  pushup(p);
}
long long query(int L, int R, int l = 1, int r = m, int p = 1) {
  if (L <= l && r <= R) return mi[p];
  int mid = (l + r) >> 1;
  pushdown(p);
  long long res = LLONG_MAX;
  if (L <= mid) res = query(L, R, l, mid, (p << 1));
  if (mid < R) res = min(res, query(L, R, mid + 1, r, (p << 1 | 1)));
  return res;
}
}  // namespace Sgt
using Sgt::modify;
using Sgt::query;
void predfs(int u, int p = 0) {
  dn[u] = now + 1;
  for (auto t : d[u]) {
    e[t.first].push_back(++now);
    c[now] = t.second;
  }
  owp[u] = now;
  for (auto v : G[u]) {
    if (v == p) continue;
    predfs(v, u);
  }
  up[u] = now;
}
void dfs(int u, int p = 0) {
  long long sum = 0;
  for (auto v : G[u]) {
    if (v == p) continue;
    dfs(v, u);
    if ((unsigned long long)sum + (unsigned long long)f[v] >
        (unsigned long long)LLONG_MAX)
      puts("-1"), exit(0);
    sum += f[v];
  }
  for (int v : G[u]) {
    if (v != p && dn[v] <= up[v]) modify(dn[v], up[v], sum - f[v]);
  }
  if (dn[u] <= owp[u]) modify(dn[u], owp[u], sum);
  for (int t : e[u]) modify(t, t, INF);
  if (dn[u] <= up[u])
    f[u] = query(dn[u], up[u]);
  else
    f[u] = INF;
}
int main() {
  cin >> n >> m;
  for (int i = 2, u, v; i <= n; ++i) {
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  for (int i = 1, u, v, w; i <= m; ++i) {
    scanf("%d%d%d", &u, &v, &w);
    if (u == v) {
      --m, --i;
      continue;
    }
    d[u].push_back(make_pair(v, w));
  }
  ++m, d[1].push_back(make_pair(0, 0));
  predfs(1);
  Sgt::build();
  dfs(1);
  if (f[1] >= INF) f[1] = -1;
  cout << f[1] << endl;
  return 0;
}
