#include <bits/stdc++.h>
#pragma GCC optimize("O2")
using namespace std;
const int MAXN = 1e6 + 10;
const long long MOD = 1e9 + 7;
const long long MOD2 = 998244353;
const long long INF = 8e18;
const int LOG = 22;
long long pw(long long a, long long b, long long mod) {
  return (!b ? 1
             : (b & 1 ? (a * pw(a * a % mod, b / 2, mod)) % mod
                      : pw(a * a % mod, b / 2, mod)));
}
long long dp[2][MAXN];
int x[MAXN];
vector<int> G[MAXN];
void DFS(int v, int par) {
  dp[0][v] = 1;
  dp[1][v] = 0;
  for (auto u : G[v]) {
    if (u == par) {
      continue;
    }
    DFS(u, v);
    dp[1][v] = (dp[1][v] * dp[0][u]) % MOD;
    dp[1][v] = (dp[1][v] + dp[1][u] * dp[0][v]) % MOD;
    dp[0][v] = (dp[0][v] * dp[0][u]) % MOD;
  }
  if (x[v]) {
    dp[1][v] = dp[0][v];
  } else {
    dp[0][v] = (dp[0][v] + dp[1][v]) % MOD;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  int n;
  cin >> n;
  for (int i = 1; i < n; i++) {
    int a;
    cin >> a;
    G[a].push_back(i);
    G[i].push_back(a);
  }
  for (int i = 0; i < n; i++) {
    cin >> x[i];
  }
  DFS(0, -1);
  cout << dp[1][0] << "\n";
  return 0;
}
