// 1<=n<=1e5 0<=k<=n 1<=x,y<=n x!=y 1<=b<=N 1<=c<=3
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e5+5,mod=1e9+7;
int col[MAXN],dp[MAXN][5];
vector<int> e[MAXN];
void dfs(int id,int pre){
if (col[id]==0){
dp[id][1]=dp[id][2]=dp[id][3]=1;
for (int i:e[id]){
if (i==pre) continue;
dfs(i,id);
dp[id][1]*=(dp[i][2]+dp[i][3])%mod;
dp[id][1]%=mod;
dp[id][2]*=(dp[i][1]+dp[i][3])%mod;
dp[id][2]%=mod;
dp[id][3]*=(dp[i][1]+dp[i][2])%mod;
dp[id][3]%=mod;
}
}
else{
dp[id][col[id]]=1;
for (int i:e[id]){
if (i==pre) continue;
dfs(i,id);
int tmp=dp[i][1]+dp[i][2]+dp[i][3];
dp[id][col[id]]*=(tmp-dp[i][col[id]])%mod;
dp[id][col[id]]%=mod;
}
}
}
signed main(){
int n,k;
scanf("%lld %lld",&n,&k);
for (int i=1;i<n;i++){
int u,v;
scanf("%lld %lld",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
for (int i=1;i<=k;i++){
int u,v;
scanf("%lld %lld",&u,&v);
col[u]=v;
}
dfs(1,-1);
printf("%lld",(dp[1][1]+dp[1][2]+dp[1][3])%mod);
return 0;
}
第31行运算完不能取模,否则可能减出负数!输出要取模!