#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define iii pair<int, ii>
#define fi first
#define se second
#define inf 10000000000000000
const int N = 2e5 + 5;
int n, m, h[N], up[N][20], f[N], in[N], out[N], bit1[N], bit2[N], cnt;
vector<int> g[N];
struct yc {
    int u, v, c;
};
vector<yc> qr[N];
void update1(int pos, int val) {
    for(pos;pos <= 2*n; pos += pos&(-pos)) bit1[pos] += val;
}
int get1(int pos) {
    int res = 0;
    for(pos;pos>0;pos -= pos&(-pos)) res += bit1[pos];
    return res;
}
int pathf(int u, int v, int l) {
    return get1(in[u]) + get1(in[v]) - 2*(get1(in[l])) + get1(in[l])-get1(in[l]-1);
}
void update2(int pos, int val) {
    for(pos;pos <= 2*n; pos += pos&(-pos)) bit2[pos] += val;
}
int get2(int pos) {
    int res = 0;
    for(pos;pos>0;pos -= pos&(-pos)) res += bit2[pos];
    return res;
}
int pathsum(int u, int v, int l) {
    return get2(in[u]) + get2(in[v]) - 2*(get2(in[l])) + get2(in[l])-get2(in[l]-1);
}
void build(int u, int par) {
    in[u] = ++cnt;
    for(int v : g[u]) {
        if(v == par) continue;
        h[v] = h[u] + 1;
        up[v][0] = u;
        for(int j = 1; j <= 19; j++) up[v][j] = up[up[v][j-1]][j-1];
        build(v,u);
    }
    out[u] = ++cnt;
}
int lca(int u, int v) {
    if(h[u] > h[v]) swap(u,v);
    int dis = h[v] - h[u];
    for(int j = 0; j <= 19; j++) {
        if(dis&(1<<j)) v = up[v][j];
    }
    if(u == v) return u;
    int k = __lg(h[u]);
    for(int j = k; j >= 0; j--) {
        if(up[v][j] != up[u][j]) {
            v = up[v][j];
            u = up[u][j];
        }
    }
    return up[u][0];
}
void dfs(int u, int par) {
    int sum = 0;
    for(int v : g[u]) {
        if(v == par) continue;
        dfs(v,u);
        sum += f[v];
    }
    f[u] = sum;
    update2(in[u],sum);
    update2(out[u],-sum);
    for(auto it : qr[u]) {
        int l = it.u, r = it.v, c = it.c;
//        if(u == 1) {
//            cout << "* " << l << ' ' << r << '\n';
//            cout << pathsum(l,r,u) << '\n';
//            cout << pathf(l,r,u) << '\n';
//        }
        f[u] = max(f[u],pathsum(l,r,u)-pathf(l,r,u) + c) ;
    }
    update1(in[u],f[u]);
    update1(out[u],-f[u]);
}
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    if(fopen("main.inp","r")) {
        freopen("main.inp", "r", stdin);
        freopen("main.out", "w", stdout);
    }
    cin >> n;
    for(int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    build(1,1);
    cin >> m;
    for(int i = 1; i <= m; i++) {
        int u, v, c;
        cin >> u >> v >> c;
        int l = lca(u,v);
        qr[l].push_back({u,v,c});
        //cout << u << ' ' << v << ' ' << l << ' ' << c << '\n';
    }
    dfs(1,1);
    cout << f[1];
    //for(int i = 1; i <= n; i++) cout << f[i] << '\n';
    return 0;
}
Compilation message (stderr)
election_campaign.cpp: In function 'int main()':
election_campaign.cpp:93:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |         freopen("main.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
election_campaign.cpp:94:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |         freopen("main.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |