#include <bits/stdc++.h>
using namespace std;
int n, m, dp[300010];
vector<int> V[300010];
priority_queue<pair<long long, int> > q[300010];
long long delta[300010], ans;
bool dfs(int x, int pa) {
  int mxid = x, mxsz = q[x].size();
  for (int i = 0; i < V[x].size(); i++) {
    int y = V[x][i];
    if (y == pa)
      continue;
    else {
      dp[y] = dp[x] + 1;
      if (!dfs(y, x)) return false;
      if (mxsz < q[y].size()) {
        mxid = y;
        mxsz = q[y].size();
      }
      if (x == 1) ans += delta[y] - q[y].top().first;
    }
  }
  if (x == 1) return true;
  long long dd = 0;
  if (x != mxid) {
    long long del = -q[mxid].top().first;
    dd = del;
    swap(q[x], q[mxid]);
    delta[x] += delta[mxid];
    while (!q[mxid].empty()) {
      pair<long long, int> tt;
      tt = q[mxid].top();
      q[mxid].pop();
      q[x].push({tt.first - dd, tt.second});
    }
  }
  for (int i = 0; i < V[x].size(); i++) {
    int y = V[x][i];
    if (y == pa || y == mxid)
      continue;
    else {
      long long del = -q[y].top().first;
      delta[x] += del + delta[y];
      while (!q[y].empty()) {
        pair<long long, int> tt;
        tt = q[y].top();
        q[y].pop();
        q[x].push({tt.first + del - dd, tt.second});
      }
    }
  }
  while (!q[x].empty()) {
    if (dp[q[x].top().second] >= dp[x])
      q[x].pop();
    else
      break;
  }
  if (q[x].empty())
    return false;
  else
    return true;
}
int main() {
  scanf("%d%d", &n, &m);
  int x, y;
  long long c;
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &x, &y);
    V[x].push_back(y);
    V[y].push_back(x);
  }
  while (m--) {
    scanf("%d%d%I64d", &x, &y, &c);
    q[x].push({-c, y});
  }
  if (!dfs(1, 0))
    puts("-1");
  else
    printf("%I64d\n", ans);
}
