/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Main
{
private static int sum = 0;
private static int[] b;
private static int m;
private static HashMap
<Integer, Integer
> mpp
; private static int cnt = 0;
public static void dfs(int node, ArrayList<Integer>[] adj, int[] used, int[] parent){
used[node] = 1;
sum += b[node];
int k = sum%m;
if(mpp.containsKey(k)){
cnt += mpp.get(k);
}
mpp.put(k, mpp.getOrDefault(k,0)+1);
for(int child: adj[node]){
if(used[child] == 0){
parent[child] = node;
dfs(child, adj, used, parent);
}
}
mpp.put(k, mpp.get(k) - 1);
sum -= b[node];
}
{
// your code goes here
Scanner sc
= new Scanner
(System.
in);
int n = sc.nextInt();
for(int i=0;i<n;i++){
adj[i] = new ArrayList<>();
}
for(int i=0;i<n-1;i++){
int u = sc.nextInt();
int v = sc.nextInt();
adj[u].add(v);
adj[v].add(u);
}
b = new int[n];
for(int i=0;i<n;i++){
b[i] = sc.nextInt();
}
m = sc.nextInt();
mpp = new HashMap<>();
mpp.put(0,1);
int[] used = new int[n];
int[] parent = new int[n];
dfs(0,adj,used,parent);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgTWFpbgp7Cglwcml2YXRlIHN0YXRpYyBpbnQgc3VtID0gMDsKCXByaXZhdGUgc3RhdGljIGludFtdIGI7Cglwcml2YXRlIHN0YXRpYyBpbnQgbTsKCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4gbXBwOwoJcHJpdmF0ZSBzdGF0aWMgaW50IGNudCA9IDA7CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBkZnMoaW50IG5vZGUsIEFycmF5TGlzdDxJbnRlZ2VyPltdIGFkaiwgaW50W10gdXNlZCwgaW50W10gcGFyZW50KXsKCQl1c2VkW25vZGVdID0gMTsKCQlzdW0gKz0gYltub2RlXTsKCQlpbnQgayA9IHN1bSVtOwoJCWlmKG1wcC5jb250YWluc0tleShrKSl7CgkJCWNudCArPSBtcHAuZ2V0KGspOwoJCX0KCQltcHAucHV0KGssIG1wcC5nZXRPckRlZmF1bHQoaywwKSsxKTsKCQkKCQlmb3IoaW50IGNoaWxkOiBhZGpbbm9kZV0pewoJCQlpZih1c2VkW2NoaWxkXSA9PSAwKXsKCQkJCXBhcmVudFtjaGlsZF0gPSBub2RlOwoJCQkJZGZzKGNoaWxkLCBhZGosIHVzZWQsIHBhcmVudCk7CgkJCX0KCQl9CgkJCgkJbXBwLnB1dChrLCBtcHAuZ2V0KGspIC0gMSk7CgkJc3VtIC09IGJbbm9kZV07Cgl9CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCgkJU2Nhbm5lciBzYyA9IG5ldyBTY2FubmVyIChTeXN0ZW0uaW4pOwoJCQoJCWludCBuID0gc2MubmV4dEludCgpOwoJCUFycmF5TGlzdDxJbnRlZ2VyPltdIGFkaiA9IG5ldyBBcnJheUxpc3Rbbl07CgkJZm9yKGludCBpPTA7aTxuO2krKyl7CgkJCWFkaltpXSA9IG5ldyBBcnJheUxpc3Q8PigpOwoJCX0KCQkKCQlmb3IoaW50IGk9MDtpPG4tMTtpKyspewoJCQlpbnQgdSA9IHNjLm5leHRJbnQoKTsKCQkJaW50IHYgPSBzYy5uZXh0SW50KCk7CgkJCWFkalt1XS5hZGQodik7CgkJCWFkalt2XS5hZGQodSk7CgkJfQoJCQoJCWIgPSBuZXcgaW50W25dOwoJCWZvcihpbnQgaT0wO2k8bjtpKyspewoJCQliW2ldID0gc2MubmV4dEludCgpOwoJCX0KCQltID0gc2MubmV4dEludCgpOwoJCW1wcCA9IG5ldyBIYXNoTWFwPD4oKTsKCQltcHAucHV0KDAsMSk7CgkJCgkJaW50W10gdXNlZCA9IG5ldyBpbnRbbl07CgkJaW50W10gcGFyZW50ID0gbmV3IGludFtuXTsKCQlkZnMoMCxhZGosdXNlZCxwYXJlbnQpOwoJCVN5c3RlbS5vdXQucHJpbnRsbihjbnQpOwoJCQoJfQp9