#include <bits/stdc++.h>
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
#define FOD(i, a, b) for(int i = (a); i >= (b); i--)
#define file(name) if(fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
#define el cout << '\n'
#define maxn int(1e5 + 5)
using namespace std;
typedef long long ll;
const int LOG = 17;
struct Node {
int u, v, w;
};
int n, m;
int now, tin[maxn], tout[maxn];
int d[maxn], par[maxn][20];
ll t[maxn];
ll dp[maxn][2];
vector<int> adj[maxn];
vector<Node> node[maxn];
void update(int x, ll v) {
for(; x <= n; x += x & -x) t[x] += v;
}
void update(int l, int r, ll x) {
update(l, x);
update(r + 1, -x);
}
ll get(int x) {
ll res = 0;
for(; x; x -= x & -x) res += t[x];
return res;
}
void dfscount(int u) {
tin[u] = ++now;
for(int v : adj[u]) if(v != par[u][0]) {
par[v][0] = u;
d[v] = d[u] + 1;
dfscount(v);
}
tout[u] = now;
}
int lca(int u, int v) {
if(d[u] < d[v]) swap(u, v);
int k = d[u] - d[v];
FOD(i, LOG, 0) if(k >> i & 1) u = par[u][i];
if(u == v) return u;
FOD(i, LOG, 0) if(par[u][i] != par[v][i]) u = par[u][i], v = par[v][i];
return par[u][0];
}
ll getDist(int u, int v) {
return get(tin[u]) + get(tin[v]) - (get(tin[lca(u, v)]) << 1);
}
void dfs(int u) {
for(int v : adj[u]) if(v != par[u][0]) {
dfs(v);
dp[u][0] += max(dp[v][0], dp[v][1]);
}
for(Node x : node[u])
dp[u][1] = max(dp[u][1], x.w + dp[u][0] + getDist(x.u, x.v));
update(tin[u], tout[u], dp[u][0] - max(dp[u][0], dp[u][1]));
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
FOR(i, 1, n - 1) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfscount(1);
FOR(i, 1, LOG)
FOR(u, 1, n)
par[u][i] = par[par[u][i - 1]][i - 1];
cin >> m;
while(m--) {
int u, v, w;
cin >> u >> v >> w;
node[lca(u, v)].push_back({ u, v, w });
}
dfs(1);
cout << max(dp[1][0], dp[1][1]);
return 0;
}