#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300007;
map<int, long long> allVals[MAXN];
long long offset[MAXN];
vector<int> G[MAXN];
vector<pair<int, int> > workers[MAXN];
int N, M, dep[MAXN];
void kill() {
  cout << -1 << endl;
  exit(0);
}
void update(int d, long long val, map<int, long long> &valMap) {
  auto it = valMap.find(d);
  if (it != valMap.end() && it->second <= val) {
    return;
  }
  it = valMap.lower_bound(d);
  if (it != valMap.begin() && prev(it)->second <= val) {
    return;
  }
  valMap[d] = val;
  while (true) {
    it = next(valMap.find(d));
    if (it == valMap.end()) return;
    if (it->second < val) return;
    valMap.erase(it);
  }
}
void dfs(int u, int p) {
  for (int &v : G[u]) {
    if (v == p) swap(v, G[u].back());
  }
  if (!G[u].empty() && G[u].back() == p) {
    G[u].pop_back();
  }
  for (int &v : G[u]) {
    dep[v] = dep[u] + 1;
    dfs(v, u);
    if (((int)allVals[v].size()) > ((int)allVals[G[u][0]].size())) {
      swap(G[u][0], v);
    }
  }
  long long totalMin = 0;
  for (int &v : G[u]) {
    while (!allVals[v].empty() && prev(allVals[v].end())->first > dep[u]) {
      allVals[v].erase(prev(allVals[v].end()));
    }
    if (allVals[v].empty()) kill();
    totalMin += prev(allVals[v].end())->second + offset[v];
  }
  for (int &v : G[u]) {
    offset[v] += totalMin - prev(allVals[v].end())->second - offset[v];
  }
  if (G[u].empty()) {
    allVals[u][dep[u]] = 0;
    offset[u] = 0;
  } else {
    offset[u] = offset[G[u][0]];
    allVals[u].swap(allVals[G[u][0]]);
  }
  for (int &v : G[u])
    if (v != G[u][0]) {
      for (auto x : allVals[v]) {
        update(x.first, x.second + offset[v] - offset[u], allVals[u]);
      }
    }
  assert(!allVals[u].empty());
  long long bareMin = prev(allVals[u].end())->second;
  for (pair<int, int> worker : workers[u]) {
    update(dep[worker.first], worker.second + bareMin, allVals[u]);
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> N >> M;
  for (int i = 0; i <= N - 2; ++i) {
    int u, v;
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  for (int i = 0; i <= M - 1; ++i) {
    int u, v, c;
    cin >> u >> v >> c;
    workers[u].emplace_back(v, c);
  }
  dfs(1, 0);
  assert(!allVals[1].empty());
  cout << prev(allVals[1].end())->second + offset[1] << endl;
  return 0;
}
