#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool getmin(T *a, const T &b) {
  if (b < *a) {
    *a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool getmax(T *a, const T &b) {
  if (b > *a) {
    *a = b;
    return true;
  }
  return false;
}
template <class T>
inline void read(T *a) {
  char c;
  while (isspace(c = getchar())) {
  }
  bool flag = 0;
  if (c == '-')
    flag = 1, *a = 0;
  else
    *a = c - 48;
  while (isdigit(c = getchar())) *a = *a * 10 + c - 48;
  if (flag) *a = -*a;
}
const int mo = 1000000007;
template <class T>
T pow(T a, T b, int c = mo) {
  T res = 1;
  for (T i = 1; i <= b; i <<= 1, a = 1LL * a * a % c)
    if (b & i) res = 1LL * res * a % c;
  return res;
}
const int N = 310000;
multiset<long long> V[N];
map<int, long long> S[N];
vector<pair<int, int> > q[N];
int n, m;
struct node {
  int p, nextt;
} edge[N * 2];
int cnt;
int head[N];
void ae(int a, int b) {
  edge[++cnt].p = b;
  edge[cnt].nextt = head[a];
  head[a] = cnt;
}
long long tag[N];
void remove(int x, long long d) {
  multiset<long long>::iterator it = V[x].find(d);
  V[x].erase(it);
}
void combine(int x, int y) {
  bool flag = 0;
  if (S[x].size() > S[y].size()) swap(x, y), flag = 1;
  long long mx = *V[x].begin();
  mx += tag[x];
  long long my = *V[y].begin();
  my += tag[y];
  tag[y] += mx;
  for (map<int, long long>::iterator it = S[x].begin(); it != S[x].end();
       ++it) {
    it->second += tag[x];
    long long d = it->second - tag[y] + my;
    if (S[y].find(it->first) == S[y].end())
      S[y][it->first] = d, V[y].insert(d);
    else {
      if (d < S[y][it->first])
        remove(y, S[y][it->first]), S[y][it->first] = d, V[y].insert(d);
    }
  }
  V[x].clear();
  S[x].clear();
  if (flag) swap(V[x], V[y]), swap(S[x], S[y]), swap(tag[x], tag[y]);
}
bool dfs(int u, int fa) {
  S[u][u] = 0;
  V[u].insert(0);
  for (int i = 0; i < q[u].size(); ++i) {
    int v = q[u][i].first;
    long long d = q[u][i].second;
    if (S[u].find(v) == S[u].end())
      S[u][v] = d, V[u].insert(d);
    else if (d < S[u][v])
      remove(u, S[u][v]), S[u][v] = d, V[u].insert(d);
  }
  for (int k = head[(u)]; k; k = edge[k].nextt) {
    int v = edge[k].p;
    if (v == fa) continue;
    if (!dfs(v, u)) return false;
    if (S[v].find(v) != S[v].end()) {
      remove(v, S[v][v]);
      S[v].erase(v);
    }
    if (S[v].empty()) return false;
    combine(v, u);
  }
  return true;
}
int main() {
  cin >> n >> m;
  for (int i = (2); i <= (n); ++i) {
    int u, v;
    read(&u);
    read(&v);
    ae(u, v);
    ae(v, u);
  }
  for (int i = (1); i <= (m); ++i) {
    int x, y, z;
    read(&x);
    read(&y);
    read(&z);
    q[x].push_back(std::make_pair(y, z));
  }
  if (!dfs(1, 0)) {
    cout << -1 << endl;
  } else
    cout << *V[1].begin() + tag[1] << endl;
  return 0;
}
