#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
typedef long long ll;
ll read();
struct Edge{
int ed,next;
}eg[N*2];
ll n,p,tot,ans;
ll nbs[N],c[N],v[N],sum[N],vum[N];
void add(ll x,ll y)
{
tot++; eg[tot].ed=y; eg[tot].next=nbs[x]; nbs[x]=tot;
}
void get_sum(int k,int fa)
{
sum[k]=1;
for(int x=nbs[k];x;x=eg[x].next)
{
int u=eg[x].ed;
if(u==fa) continue;
get_sum(u,k);
sum[k]=(sum[k]*sum[u])%p;
}
sum[k]=(sum[k]*c[k])%p;
}
void get_vum(int k,int fa)
{
vum[k]=1;
for(int x=nbs[k];x;x=eg[x].next)
{
int u=eg[x].ed;
if(u==fa) continue;
get_vum(u,k);
vum[k]=(vum[k]*vum[u])%p;
}
vum[k]=(vum[k]*v[k])%p;
if(vum[k]==0) vum[k]=1;
}
void dfs(int k,int fa)
{
for(int x=nbs[k];x;x=eg[x].next)
{
int u=eg[x].ed;
if(u==fa) continue;
dfs(u,k);
}
if(k==1) ans=(ans+sum[1])%p;
else ans=(ans+(sum[k]*(vum[1]/vum[k])%p))%p;
}
int main()
{
n=read(); p=read();
for(int i=1;i<n;i++)
{
ll x=read(),y=read();
add(x,y); add(y,x);
}
for(int i=1;i<=n;i++) c[i]=read();
for(int i=1;i<=n;i++) v[i]=read();
get_sum(1,0); get_vum(1,0); dfs(1,0);
cout<<ans;
return 0;
}
ll read()
{
ll x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}