#include <bits/stdc++.h>
using namespace std;
namespace thecold {
inline int read() {
  int res = 0;
  bool flag = false;
  char c = getchar();
  while (!isdigit(c)) flag = (c == '-'), c = getchar();
  while (isdigit(c)) res = res * 10 + (c ^ 48), c = getchar();
  return !flag ? res : -res;
}
const int Max_n = 3e5 + 5;
struct node {
  int nex, to;
  node(int a, int b) { nex = a, to = b; }
  node() {}
} edge[Max_n << 1];
int head[Max_n], tot, n, m;
inline void add_edge(const int x, const int y) {
  edge[++tot] = node(head[x], y), head[x] = tot;
  edge[++tot] = node(head[y], x), head[y] = tot;
}
int dep[Max_n];
void dfs_dep(const int now, const int from) {
  dep[now] = dep[from] + 1;
  for (int i = head[now]; i; i = edge[i].nex) {
    int nex = edge[i].to;
    if (nex == from) continue;
    dfs_dep(nex, now);
  }
}
int fa[Max_n], val[Max_n], tag[Max_n], son[Max_n][2], root[Max_n];
int down[Max_n], up[Max_n], dis[Max_n];
inline int find(const int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
inline void push_down(const int x) {
  if (!tag[x]) return;
  if (son[x][0]) val[son[x][0]] -= tag[x], tag[son[x][0]] += tag[x];
  if (son[x][1]) val[son[x][1]] -= tag[x], tag[son[x][1]] += tag[x];
  tag[x] = 0;
}
int merge(int x, int y) {
  if (!x || !y) return x | y;
  if (val[x] > val[y]) swap(x, y);
  push_down(x), push_down(y);
  son[x][1] = merge(son[x][1], y);
  fa[son[x][1]] = x;
  if (dis[son[x][0]] < dis[son[x][1]]) swap(son[x][0], son[x][1]);
  dis[x] = dis[son[x][1]] + 1;
  return x;
}
long long ans;
inline void del(const int x, const int pos) {
  push_down(x);
  fa[son[x][0]] = son[x][0], fa[son[x][1]] = son[x][1];
  root[pos] = fa[son[x][0]] = fa[son[x][1]] = fa[x] =
      merge(son[x][0], son[x][1]);
}
int cnt[Max_n];
inline void dfs_tree(const int now, const int from) {
  for (int i = head[now]; i; i = edge[i].nex) {
    int nex = edge[i].to;
    if (nex == from) continue;
    dfs_tree(nex, now);
    if (!root[now])
      root[now] = root[nex];
    else
      root[now] = fa[root[now]] = fa[root[nex]] = merge(root[now], root[nex]);
  }
  while (dep[up[root[now]]] >= dep[now]) del(root[now], now);
  if (now != 1 && !find(root[now])) {
    puts("-1");
    exit(0);
  }
  ans += val[root[now]];
  tag[root[now]] += val[root[now]], val[root[now]] = 0;
}
inline void main() {
  n = read(), m = read();
  for (int i = 1; i < n; ++i) add_edge(read(), read());
  dfs_dep(1, 0);
  for (int i = 1; i <= m; ++i) {
    fa[i] = i, dis[i] = 1;
    down[i] = read(), up[i] = read(), val[i] = read();
    if (dep[down[i]] < dep[up[i]]) swap(down[i], up[i]);
    ++cnt[down[i]], --cnt[up[i]];
    if (!root[down[i]])
      root[down[i]] = i;
    else {
      root[down[i]] = fa[i] = fa[root[down[i]]] = merge(i, root[down[i]]);
    }
  }
  dfs_tree(1, 0);
  printf("%lld\n", ans);
}
}  // namespace thecold
int main() {
  thecold::main();
  return 0;
}
