#include <bits/stdc++.h>
const int MAX_N = (int)3e5 + 123;
const double eps = 1e-6;
const long long int inf = (long long int)1e18 + 123;
using namespace std;
vector<int> g[MAX_N], first[MAX_N], del[MAX_N];
vector<pair<int, int> > query[MAX_N];
int n, m;
int lvl[MAX_N];
void dfs(int v, int pr = 0) {
  lvl[v] = lvl[pr] + 1;
  for (auto to : first[v])
    if (to != pr) {
      dfs(to, v);
      g[v].push_back(to);
    }
}
bool cmp(pair<int, int> a, pair<int, int> b) {
  if (lvl[a.first] != lvl[b.first]) return lvl[a.first] > lvl[b.first];
  return a.second > b.second;
}
struct num {
  long long int add;
  set<pair<long long int, int> > q;
  long long int get_min() {
    if (q.empty()) return inf;
    return q.begin()->first + add;
  }
} t[MAX_N];
long long int val[MAX_N];
void update(int v) {
  for (auto i : del[v]) {
    t[v].q.erase(make_pair(val[i], i));
    assert(query[i].back().first == v);
    val[i] -= query[i].back().second;
    query[i].pop_back();
    if (!query[i].empty()) {
      val[i] += query[i].back().second;
      t[v].q.insert(make_pair(val[i], i));
    }
  }
}
void calc(int v) {
  long long int all = 0;
  for (auto to : g[v]) {
    calc(to);
    update(to);
    if (t[to].q.empty()) {
      puts("-1");
      exit(0);
    }
    all += t[to].get_min();
  }
  for (auto to : g[v]) {
    t[to].add += all - t[to].get_min();
    if ((int)((t[v].q).size()) < (int)((t[to].q).size())) swap(t[v], t[to]);
    for (auto j : t[to].q) {
      long long int now = j.first + t[to].add;
      val[j.second] = now - t[v].add;
      t[v].q.insert(make_pair(now - t[v].add, j.second));
    }
  }
  if (!query[v].empty()) {
    long long int now = all + query[v].back().second;
    val[v] = now - t[v].add;
    t[v].q.insert(make_pair(now - t[v].add, v));
  }
}
int main() {
  scanf("%d%d", &n, &m);
  if (n == 1) {
    puts("0");
    return 0;
  }
  for (int i = 1, u, v; i < n; i++) {
    scanf("%d%d", &u, &v);
    first[u].push_back(v), first[v].push_back(u);
  }
  for (int i = 1, u, v, c; i <= m; i++) {
    scanf("%d%d%d", &u, &v, &c);
    if (u == v) continue;
    query[u].push_back(make_pair(v, c));
  }
  dfs(1);
  vector<pair<int, int> > st;
  for (int i = 1; i <= n; i++) {
    sort(query[i].begin(), query[i].end(), &cmp);
    st.clear();
    for (auto j : query[i]) {
      while (!st.empty() && st.back().second >= j.second) st.pop_back();
      st.push_back(j);
    }
    reverse(st.begin(), st.end());
    for (auto j : st) del[j.first].push_back(i);
    query[i] = st;
  }
  calc(1);
  long long int ans = t[1].get_min();
  if (ans == inf)
    puts("-1");
  else
    printf("%lld", ans);
  return 0;
}
