#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 123, INF = 1e9, mod = 1e9 + 7, N = 2e5 + 123;
struct btr {
  map<int, long long> dp;
  set<pair<long long, int> > st;
  long long mn, add;
};
vector<int> g[maxn];
int n, m;
btr a[maxn];
void Merge(btr &a, btr &b) {
  if (a.dp.size() < b.dp.size()) swap(a, b);
  long long x = a.add, y = b.add;
  a.add += b.mn + y;
  b.add += a.mn + x;
  for (auto x : b.dp) {
    int v = x.first;
    long long c = x.second + b.add - a.add;
    if (!a.dp.count(v) || a.dp[v] > c) {
      a.st.erase({a.dp[v], v});
      a.dp[v] = c;
      a.st.insert({a.dp[v], v});
    }
  }
  if (!a.st.empty()) a.mn = a.st.begin()->first;
}
void dfs(int v, int p) {
  if (!a[v].st.empty()) a[v].mn = a[v].st.begin()->first;
  btr tmp;
  bool flag = 0;
  for (auto to : g[v]) {
    if (to == p) continue;
    dfs(to, v);
    if (!flag)
      swap(tmp, a[to]);
    else
      Merge(tmp, a[to]);
    flag = 1;
    a[to].dp.clear();
    a[to].st.clear();
  }
  if (flag) {
    for (auto x : a[v].dp) {
      int u = x.first;
      long long c = x.second + tmp.mn;
      if (!tmp.dp.count(u) || tmp.dp[u] > c) {
        tmp.st.erase({tmp.dp[u], u});
        tmp.dp[u] = c;
        tmp.st.insert({tmp.dp[u], u});
      }
    }
    swap(a[v], tmp);
  }
  if (v != 1 && a[v].dp.count(v)) {
    a[v].st.erase({a[v].dp[v], v});
    a[v].dp.erase(v);
    if (!a[v].st.empty()) a[v].mn = a[v].st.begin()->first;
  }
  if (a[v].st.empty()) {
    cerr << v << endl;
    printf("-1");
    exit(0);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  if (n == 1) {
    printf("0");
    exit(0);
  }
  for (int i = 1; i < n; i++) {
    int v, u;
    scanf("%d%d", &v, &u);
    g[v].push_back(u);
    g[u].push_back(v);
  }
  for (int i = 0; i < m; i++) {
    int u, v, c;
    scanf("%d%d%d", &v, &u, &c);
    if (!a[v].dp.count(u) || a[v].dp[u] > c) {
      a[v].st.erase({a[v].dp[u], u});
      a[v].dp[u] = c;
      a[v].st.insert({a[v].dp[u], u});
    }
  }
  dfs(1, 1);
  printf("%lld", 0ll + a[1].mn + a[1].add);
}
