#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5;
const int mod=1e9+7;
int n,k;
int color[N+5];
vector<int>to[N+5];
int dp[N+5][5];
void dfs(int anc,int root)
{
dp[root][1]=dp[root][2]=dp[root][3]=1;
bool flag=1;
for(auto v:to[root])
{
if(v==anc) continue;
flag=0;
dfs(root,v);
dp[root][1]*=dp[v][2]+dp[v][3]%mod;
dp[root][2]*=dp[v][1]+dp[v][3]%mod;
dp[root][3]*=dp[v][2]+dp[v][1]%mod;
dp[root][1]%=mod;
dp[root][2]%=mod;
dp[root][3]%=mod;
if(color[root])
{
for(int i=1;i<=3;i++)
if(i!=color[i])
dp[root][i]=0;
}
}
if(flag)
{
dp[root][1]=dp[root][2]=dp[root][3]=0;
if(color[root]==0)
dp[root][1]=dp[root][2]=dp[root][3]=1;
else
dp[root][color[root]]=1;
}
}
signed main()
{
cin>>n>>k;
for(int i=1;i<=n-1;i++)
{
int u,v;
cin>>u>>v;
to[u].push_back(v),to[v].push_back(u);
}
for(int i=1;i<=k;i++)
{
int a,b;
cin>>a>>b;
color[a]=b;
}
dfs(1,1);
cout<<(dp[1][1]+dp[1][2]+dp[1][3])%mod;
return 0;
}