#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0;
  char ch = getchar();
  bool d = 1;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') d = 0;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  return d ? x : -x;
}
inline unsigned long long rnd() {
  return ((unsigned long long)rand() << 30 ^ rand()) << 4 | rand() % 4;
}
const int N = 3e5 + 5;
struct info {
  int lson, rson, d, id;
  long long w, lazy;
} t[N];
void add(int k, long long x) {
  if (!k) return;
  t[k].w += x;
  t[k].lazy += x;
}
void pushdown(int k) {
  if (!t[k].lazy) return;
  add(t[k].lson, t[k].lazy);
  add(t[k].rson, t[k].lazy);
  t[k].lazy = 0;
}
int merge(int x, int y) {
  if (!x || !y) return x + y;
  if (t[x].w > t[y].w) swap(x, y);
  pushdown(x);
  t[x].rson = merge(t[x].rson, y);
  if (t[t[x].lson].d < t[t[x].rson].d) swap(t[x].lson, t[x].rson);
  t[x].d = t[t[x].rson].d + 1;
  return x;
}
vector<long long> v[N];
int dep[N], root[N];
long long f[N];
bool ff;
void dfs(int u, int fa) {
  dep[u] = dep[fa] + 1;
  long long sum = 0;
  for (auto k : v[u]) {
    if (k == fa) continue;
    dfs(k, u);
    add(root[k], -f[k]);
    root[u] = merge(root[u], root[k]);
    sum += f[k];
  }
  while (root[u] && dep[t[root[u]].id] >= dep[u]) {
    pushdown(root[u]);
    root[u] = merge(t[root[u]].lson, t[root[u]].rson);
  }
  if (u == 1) return;
  if (!root[u]) ff = 1;
  add(root[u], sum);
  f[u] = t[root[u]].w;
}
int main() {
  int n = read(), m = read();
  for (int i = (int)(1); i <= (int)(n - 1); i++) {
    int x = read(), y = read();
    v[x].push_back(y);
    v[y].push_back(x);
  }
  for (int i = (int)(1); i <= (int)(m); i++) {
    int x = read(), y = read();
    long long z = read();
    if (x == y) continue;
    t[i] = (info){0, 0, 0, y, z, 0};
    root[x] = merge(root[x], i);
  }
  dfs(1, 0);
  long long ans = 0;
  for (auto k : v[1]) ans += f[k];
  if (ff) ans = -1;
  cout << ans;
}
