1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4 const int N=2e5+10,M=4e5+10,mo=998244353;
5 using namespace std;
6 struct edge {int to,from,v;}e[M];
7 int a[N],d[N],head[N],n,Q,x,cnt,p[N],tot;
8 long long f[N],G[N],H[N],g[N],h[N];
9 void insert(int x,int y,int v) { e[++cnt].to=y; e[cnt].from=head[x]; e[cnt].v=v; head[x]=cnt; }
10 void dfs1(int x,int fa)
11 {
12 int k=p[max(tot-d[x],0)];
13 p[++tot]=x,f[x]+=a[x],f[k]-=a[x];
14 for (int i=head[x];i;i=e[i].from)
15 if (e[i].to!=fa) dfs1(e[i].to,x),f[x]+=f[e[i].to];
16 f[x]=(f[x]%mo+mo)%mo,p[tot--]=0;
17 }
18 void dfs2(int x,int fa)
19 {
20 g[x]=f[x],h[x]=f[x]*f[x]%mo;
21 for (int i=head[x];i;i=e[i].from)
22 if (e[i].to!=fa)
23 dfs2(e[i].to,x),
24 h[x]=(h[x]+(2*g[x]*g[e[i].to]+h[e[i].to])%mo*e[i].v%mo)%mo,
25 g[x]=(g[x]+g[e[i].to]*e[i].v)%mo;
26 }
27 void dp(int x,int fa)
28 {
29 for (int i=head[x];i;i=e[i].from)
30 if (e[i].to!=fa)
31 {
32 long long a=(G[x]-g[e[i].to]*e[i].v%mo+mo)%mo,b=(H[x]-(a*g[e[i].to]%mo*2%mo+h[e[i].to])%mo*e[i].v%mo+mo)%mo;
33 H[e[i].to]=(h[e[i].to]+(g[e[i].to]*a%mo*2+b)%mo*e[i].v%mo)%mo;
34 G[e[i].to]=(g[e[i].to]+a*e[i].v)%mo;
35 dp(e[i].to,x);
36 }
37 }
38 int main()
39 {
40 freopen("travel.in","r",stdin),freopen("travel.out","w",stdout);
41 scanf("%d",&n);
42 for (int i=1;i<=n;i++) scanf("%d%d",&a[i],&d[i]);
43 for (int i=1,x,y,z;i<n;i++) scanf("%d%d%d",&x,&y,&z),insert(x,y,z),insert(y,x,z);
44 dfs1(1,0),dfs2(1,0),G[1]=g[1],H[1]=h[1],dp(1,0);
45 scanf("%d",&Q);
46 while (Q--) scanf("%d",&x),printf("%lld\n",H[x]);
47 }