#include <bits/stdc++.h>
using namespace std;
const long long MXN = 3e5 + 10;
long long q, n, ans;
long long Par[MXN], Sz[MXN], Min[MXN];
long long Bal[MXN], dis[MXN], Baba[MXN], Ta[MXN];
vector<long long> adj[MXN];
vector<pair<long long, long long>> V;
set<pair<long long, long long>> st[MXN];
bool hdl[MXN];
void dfs(long long u, long long par) {
  for (auto Pr : st[u]) Min[u] = min(Min[u], dis[Pr.second]);
  for (auto v : adj[u]) {
    if (v != par) {
      dis[v] = dis[u] + 1, Baba[v] = u, dfs(v, u);
      if (Min[v] > dis[u]) {
        cout << -1;
        exit(0);
      }
      Min[u] = min(Min[v], Min[u]);
    }
  }
}
long long Find(long long u) {
  return (Par[u] == u ? u : Par[u] = Find(Par[u]));
}
void Merge(long long u, long long vp) {
  if (st[u].size() > st[vp].size()) swap(st[u], st[vp]), swap(Bal[u], Bal[vp]);
  for (auto Pr : st[u]) {
    long long nc = Pr.first, nv = Pr.second;
    nc -= Bal[vp], nc += Bal[u];
    st[vp].insert({nc, nv});
  }
  st[u].clear();
}
void Union(long long u, long long v) {
  u = Find(u), v = Find(v);
  if (u == v) return;
  if (Sz[v] > Sz[u]) swap(u, v);
  Merge(v, u);
  Ta[u] = (dis[Ta[u]] < dis[Ta[v]] ? Ta[u] : Ta[v]);
  Sz[u] += Sz[v], Par[v] = u;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  memset(Min, 63, sizeof Min);
  cin >> n >> q;
  for (int i = 1; i <= n; i++) Par[i] = i, Sz[i] = 1, Ta[i] = i;
  for (int i = 0; i < n - 1; i++) {
    long long u, v;
    cin >> u >> v;
    adj[u].push_back(v), adj[v].push_back(u);
  }
  while (q--) {
    long long u, v, c;
    cin >> u >> v >> c;
    st[u].insert({c, v});
  }
  dfs(1, 0);
  for (int i = 2; i <= n; i++) V.push_back({dis[i], i});
  sort(V.begin(), V.end(), greater<pair<long long, long long>>());
  long long ii = -1;
  while (++ii < V.size()) {
    long long u = V[ii].second, val, vp, now;
    if (hdl[u]) continue;
    while (st[Find(u)].size() && dis[(st[Find(u)].begin()->second)] >= dis[u]) {
      st[Find(u)].erase(st[Find(u)].begin());
    }
    if (st[Find(u)].size() == 0) {
      cout << "WTF";
      return 0;
    }
    tie(val, vp) = *(st[Find(u)].begin());
    st[Find(u)].erase(st[Find(u)].begin());
    val += Bal[Find(u)];
    Bal[Find(u)] -= val;
    ans += val;
    now = u;
    while (dis[now] > dis[vp]) {
      if (hdl[now]) {
        long long nxt = Ta[Find(now)];
        Union(now, vp);
        if (dis[nxt] > dis[vp])
          now = nxt;
        else
          now = vp;
        continue;
      }
      hdl[now] = 1;
      Union(now, vp);
      now = Baba[now];
    }
  }
  cout << ans << '\n';
  return 0;
}
