#include <bits/stdc++.h>
using namespace std;
unordered_map<int,int>mpp;
int sum = 0;
int val[1000000] = {0};
int ans = 0;
void DFS(int node , vector<int> G[] , int used[] , int parent[] , int k){
used[node]=1;
sum += val[node];
int x = ((sum % k) + k) % k;
ans += mpp[x];
mpp[x]++;
for(auto u:G[node]){
if(used[u]==0){
parent[u] = node;
DFS(u,G,used,parent,k);
}
}
sum -= val[node];
mpp[x]--;
}
int main() {
int n ;
cin>>n ;
vector <int> G[n+1];
int i = 1 ;
while(i<=n-1){
int u,v;
cin>>u>>v ;
G[u].push_back(v);
G[v].push_back(u);
i++;
}
for(int i=1;i<=n;i++){
cin>>val[i];
}
int k;
cin>>k;
int used[n+1] = {0};
int parent[n+1] = {0};
mpp[0] = 1;
DFS(1,G,used,parent,k); //starts from node 1
cout<<ans<<endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1bm9yZGVyZWRfbWFwPGludCxpbnQ+bXBwOwoKaW50IHN1bSA9IDA7CmludCB2YWxbMTAwMDAwMF0gPSB7MH07CmludCBhbnMgPSAwOwoKdm9pZCBERlMoaW50IG5vZGUgLCB2ZWN0b3I8aW50PiBHW10gLCBpbnQgdXNlZFtdICwgaW50IHBhcmVudFtdICwgaW50IGspewoJdXNlZFtub2RlXT0xOwoJc3VtICs9IHZhbFtub2RlXTsKCWludCB4ID0gKChzdW0gJSBrKSArIGspICUgazsKCWFucyArPSBtcHBbeF07CgltcHBbeF0rKzsKCQoJZm9yKGF1dG8gdTpHW25vZGVdKXsKCQlpZih1c2VkW3VdPT0wKXsKCQkJcGFyZW50W3VdID0gbm9kZTsKCQkJREZTKHUsRyx1c2VkLHBhcmVudCxrKTsKCQl9Cgl9CgkKCXN1bSAtPSB2YWxbbm9kZV07CgltcHBbeF0tLTsKfQoKaW50IG1haW4oKSB7CgkKCWludCBuIDsgCiAgICBjaW4+Pm4gOyAKICAgIHZlY3RvciA8aW50PiBHW24rMV07CiAKICAgIGludCBpID0gMSA7IAogICAgd2hpbGUoaTw9bi0xKXsKICAgICAgICBpbnQgdSx2OwogICAgICAgIGNpbj4+dT4+diA7IAogICAgICAgIEdbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIEdbdl0ucHVzaF9iYWNrKHUpOyAKICAgICAgICBpKys7CiAgICB9CiAgICAKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKXsKICAgIAljaW4+PnZhbFtpXTsKICAgIH0KICAgIGludCBrOwogICAgY2luPj5rOwogICAgaW50IHVzZWRbbisxXSA9IHswfTsKICAgIGludCBwYXJlbnRbbisxXSA9IHswfTsKICAgIG1wcFswXSA9IDE7CiAgICBERlMoMSxHLHVzZWQscGFyZW50LGspOyAvL3N0YXJ0cyBmcm9tIG5vZGUgMQogICAgY291dDw8YW5zPDxlbmRsOwogICAgcmV0dXJuIDA7Cn0=