#include #include #include #include #include #include #include "math.h" #include #include #include #define ifor(i,a,b) for (int i=(a);i<(b);i++) #define rfor(i,a,b) for (int i=(b)-1;i>=(a);i--) #define rep(i,n) for (int i=0;i<(n);i++) #define rrep(i,n) for (int i=(n)-1;i>=0;i--) using namespace std; typedef long double ld; typedef long long int lli; typedef complex P; const double eps = 1e-11; int vex[4]={1,0,-1,0}; int vey[4]={0,1,0,-1}; typedef vector Vec; typedef vector vec; typedef vector MAT; typedef vector mat; lli MOD=1000000007; vector E[100005]; int par[100005][20]; int depth[100005]; void dfs(int v,int p,int d) { par[v][0]=p; depth[v]=d; for(int i=0;idepth[v])swap(u,v); for(int i=19;i>=0;i--) { if(((depth[v]-depth[u])>>i)&1)v=par[v][i]; } if(u==v)return u; for(int i=19;i>=0;i--) { if(par[u][i]!=par[v][i]) { u = par[u][i]; v = par[v][i]; } } return par[u][0]; } int main(){ int N; cin >> N; int a,b,c; par[0][0]=-1; rep(i,N-1){ cin>>a >>b; E[a].push_back(b); E[b].push_back(a); } queue que; que.push(0); lli cost [100005],x[100005]; rep(i,N)cin>>x[i]; cost[0]= x[0]; bool used[100005]; while(!que.empty()){ int t = que.front();que.pop(); used[t]=true; rep(i,E[t].size()){ int to = E[t][i]; if(used[to])continue; cost[to] = cost[t]+x[to]; que.push(to); } } search_depth(0); //rep(i,10)printf("(%d,%d)",i,depth[i]); fill_table(); int M; cin >> M; lli ans =0; rep(i,M){ cin>>a>>b>>c; //cout<