#include <bits/stdc++.h>
using vi = std::vector<long long int>;
using vvi = std::vector<vi>;
using pii = std::pair<long long int, long long int>;
using vpii = std::vector<pii>;
using vvpii = std::vector<vpii>;
using namespace std;
const long long int N = 2e6 + 10;
const long long int inf = 1e18 + 10;
const long long int M = 1e9 + 7;
const long double Pi = 3.14159265;
vi a[N];
long long int p[N], x[N], dp[N][2];
long long int mul(long long int a, long long int b) {
  return ((a % M) * (b % M)) % M;
}
long long int add(long long int a, long long int b) {
  return ((a % M) + (b % M)) % M;
}
pii dfs(long long int u, long long int v = -1) {
  for (auto i : a[u])
    if (v != i) {
      pii P = dfs(i, u);
      dp[u][1] =
          add(mul(dp[u][1], add(dp[i][0], dp[i][1])), mul(dp[u][0], dp[i][1]));
      dp[u][0] = mul(dp[u][0], add(dp[i][1], dp[i][0]));
    }
  return {dp[u][0], dp[u][1]};
}
void solve() {
  long long int n;
  cin >> n;
  for (long long int i = 0; i <= n - 2; i++) {
    cin >> p[i];
    a[i + 1].push_back(p[i]);
    a[p[i]].push_back(i + 1);
  }
  for (long long int i = 0; i <= n - 1; i++) {
    cin >> x[i];
    dp[i][x[i]] = 1;
  }
  cout << dfs(0).second;
}
int32_t main() {
  solve();
  long long int xx = 0;
  return 0;
}
