RT
#include <ctime>
#include <iostream>
#include <vector>
using namespace std;
using ll = long long;
const int kMaxN = 1e5 + 1, kMod = 1e9 + 7;
int clr[kMaxN];
ll n, t, dp[kMaxN][4];
vector<int> g[kMaxN];
inline void Dp(int x, int fa, int color) {
dp[x][color] = 1;
for (int i : g[x]) {
if (i != fa) {
ll sum = 0;
if (clr[i]) {
if (clr[i] != color) {
Dp(i, x, clr[i]);
sum += dp[i][clr[i]];
}
} else {
for (int j = 1; j <= 3; j++) {
if (color != j) {
Dp(i, x, j);
sum += dp[i][j];
}
}
}
dp[x][color] = (dp[x][color] * sum) % kMod;
}
}
}
int main() {
cin >> n >> t;
for (int i = 1, u, v; i < n; i++) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for (int b, c; t; t--) {
cin >> b >> c;
clr[b] = c;
}
if (clr[1]) {
Dp(1, 0, clr[1]);
} else {
for (int i = 1; i <= 3; i++) {
Dp(1, 0, i);
}
}
cout << ((dp[1][1] + dp[1][2]) % kMod + dp[1][3]) % kMod;
return 0;
}