#include <bits/stdc++.h>
using namespace std;
vector<int> ed[100001];
int flag;
int an[100001];
pair<int, int> dfs(int node, int p) {
  int i, j;
  int index = 0;
  vector<pair<int, int> > x;
  for (i = 0; i < ed[node].size(); i++) {
    int x1 = ed[node][i];
    if (x1 == p) continue;
    x.push_back(dfs(x1, node));
  }
  int n = x.size();
  if (n == 0) {
    return make_pair(an[node], 0);
  }
  int z = an[node];
  int ss[n + 1][z + 1];
  for (j = 0; j <= n; j++)
    for (i = 0; i <= z; i++) ss[j][i] = 1e6;
  ss[0][0] = 0;
  for (i = 0; i < n; i++) {
    int x1, x2, y1, y2;
    x1 = x[i].first;
    y1 = x[i].second;
    x2 = x[i].second;
    y2 = x[i].first;
    for (j = 0; j <= z; j++) {
      int k = j + x1;
      if (k <= z) ss[i + 1][k] = min(ss[i + 1][k], ss[i][j] + x2);
      k = j + y1;
      if (k <= z) ss[i + 1][k] = min(ss[i + 1][k], ss[i][j] + y2);
    }
  }
  int ans = 1e6;
  for (i = 0; i <= z; i++) ans = min(ans, ss[n][i]);
  if (ans >= (1e6)) flag = 1;
  return make_pair(z, ans);
}
int main() {
  int n;
  cin >> n;
  int i, j;
  for (i = 2; i <= n; i++) {
    int x;
    cin >> x;
    ed[x].push_back(i);
  }
  for (i = 1; i <= n; i++) cin >> an[i];
  dfs(1, 0);
  if (flag)
    cout << "Impossible" << endl;
  else
    cout << "Possible" << endl;
  return 0;
}
