#include <bits/stdc++.h>
using namespace std;
int n, m;
int root = 1;
class point {
 public:
  long long A;
  int B;
};
point make(long long a, int b) {
  point C;
  C.A = a;
  C.B = b;
  return C;
}
bool operator<(point a, point b) {
  if (a.A == b.A) return a.B > b.B;
  return a.A > b.A;
}
priority_queue<point> Q[300010];
bool vis[300010];
vector<int> G[300010];
int deep[300010] = {0};
long long del[300010] = {0};
bool flag = 1;
void DFS1(int u) {
  int i, v;
  vis[u] = 1;
  for (i = 0; i < G[u].size(); i++) {
    v = G[u][i];
    if (!vis[v]) {
      deep[v] = deep[u] + 1;
      DFS1(v);
    }
  }
}
long long ans = 0;
void merge(int i, int j) {
  if (Q[i].size() < Q[j].size()) {
    swap(Q[i], Q[j]);
    swap(del[i], del[j]);
  }
  while (Q[j].size()) {
    Q[i].push(make(Q[j].top().A + del[j] - del[i], Q[j].top().B));
    Q[j].pop();
  }
}
void DFS2(int u) {
  int i, v;
  vis[u] = 1;
  for (i = 0; i < G[u].size(); i++) {
    v = G[u][i];
    if (!vis[v]) {
      DFS2(v);
      merge(u, v);
    }
  }
  while (Q[u].size() && Q[u].top().B >= deep[u]) Q[u].pop();
  if (u != root) {
    if (Q[u].empty()) {
      flag = 0;
      return;
    }
    long long cost;
    cost = Q[u].top().A + del[u];
    ans += cost;
    del[u] -= cost;
  }
}
void read() {
  int i, u, v, w;
  cin >> n >> m;
  for (i = 1; i < n; i++) {
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  deep[1] = 1;
  memset(vis, 0, sizeof(vis));
  DFS1(root);
  for (i = 1; i <= m; i++) {
    cin >> u >> v >> w;
    Q[u].push(make(w, deep[v]));
  }
  memset(vis, 0, sizeof(vis));
  DFS2(root);
}
void work() {
  if (flag)
    cout << ans << endl;
  else
    cout << -1 << endl;
}
int main() {
  read();
  work();
  return 0;
}
