#include <bits/stdc++.h>
using namespace std;
const long long inf = 1LL << 50;
int n, m, head[300005], num, cost[300005], dfn[300005][2], tot, id[300005];
long long f[300005], ans;
vector<int> add[300005], del[300005];
struct edge {
  int to, next;
} e[600005];
struct node {
  long long tag, mink;
} t[1200005];
inline void insert(int u, int v) {
  e[++num].to = v;
  e[num].next = head[u];
  head[u] = num;
  e[++num].to = u;
  e[num].next = head[v];
  head[v] = num;
}
void dfs(int now, int fa) {
  dfn[now][0] = tot + 1;
  for (int i = 0; i < add[now].size(); i++) id[add[now][i]] = ++tot;
  for (int i = head[now]; i; i = e[i].next)
    if (e[i].to != fa) dfs(e[i].to, now);
  dfn[now][1] = tot;
  if (dfn[now][0] > dfn[now][1]) {
    puts("-1");
    exit(0);
  }
}
inline void update(int now) {
  if (t[now].tag) {
    t[((now) << 1)].tag += t[now].tag;
    t[((now) << 1)].mink += t[now].tag;
    t[((now) << 1 | 1)].tag += t[now].tag;
    t[((now) << 1 | 1)].mink += t[now].tag;
    t[now].tag = 0;
  }
}
void change(int now, int l, int r, int pos, long long d) {
  if (l == r) {
    t[now].mink = d;
    return;
  }
  update(now);
  int mid = (l + r) >> 1;
  if (pos <= mid)
    change(((now) << 1), l, mid, pos, d);
  else
    change(((now) << 1 | 1), mid + 1, r, pos, d);
  t[now].mink = min(t[((now) << 1)].mink, t[((now) << 1 | 1)].mink);
}
void inc(int now, int l, int r, int ql, int qr, long long d) {
  if (l >= ql && r <= qr) {
    t[now].mink += d;
    t[now].tag += d;
    return;
  }
  update(now);
  int mid = (l + r) >> 1;
  if (ql <= mid) inc(((now) << 1), l, mid, ql, qr, d);
  if (qr > mid) inc(((now) << 1 | 1), mid + 1, r, ql, qr, d);
  t[now].mink = min(t[((now) << 1)].mink, t[((now) << 1 | 1)].mink);
}
long long query(int now, int l, int r, int ql, int qr) {
  if (l >= ql && r <= qr) return t[now].mink;
  update(now);
  long long ans = inf;
  int mid = (l + r) >> 1;
  if (ql <= mid) ans = min(ans, query(((now) << 1), l, mid, ql, qr));
  if (qr > mid) ans = min(ans, query(((now) << 1 | 1), mid + 1, r, ql, qr));
  return ans;
}
void calc(int now, int fa) {
  long long sum = 0;
  for (int i = head[now]; i; i = e[i].next)
    if (e[i].to != fa) {
      calc(e[i].to, now);
      sum += f[e[i].to];
    }
  if (now == 1) {
    f[1] = sum;
    return;
  }
  for (int i = 0; i < add[now].size(); i++)
    change(1, 1, tot, id[add[now][i]], sum + cost[add[now][i]]);
  for (int i = 0; i < del[now].size(); i++)
    change(1, 1, tot, id[del[now][i]], inf);
  for (int i = head[now]; i; i = e[i].next)
    if (e[i].to != fa)
      inc(1, 1, tot, dfn[e[i].to][0], dfn[e[i].to][1], sum - f[e[i].to]);
  f[now] = query(1, 1, tot, dfn[now][0], dfn[now][1]);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    insert(u, v);
  }
  for (int i = 1; i <= m; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    add[u].push_back(i);
    del[v].push_back(i);
    cost[i] = w;
  }
  dfs(1, 0);
  calc(1, 0);
  printf("%I64d\n", f[1] >= inf ? -1 : f[1]);
  return 0;
}
