#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
const long long INF = 1e12;
long long n;
vector<long long> G[1010];
long long x[1010];
bool ans = true;
long long dfs(long long now) {
  if (G[now].size() == 0) return 0;
  vector<pair<long long, long long> > d;
  long long sum = 0;
  for (long long i = 0; i < G[now].size(); i++) {
    long long next = G[now][i];
    long long tmp = dfs(next);
    sum += tmp + x[next];
    d.push_back(pair<long long, long long>(tmp, x[next]));
  }
  vector<long long> f(5010, -1);
  f[0] = 0;
  for (long long i = 0; i < G[now].size(); i++) {
    long long next = G[now][i];
    vector<long long> g(5010, -1);
    for (long long j = 0; j < x[now] + 1; j++) {
      if (f[j] != -1) {
        if (j + d[i].first <= x[now]) g[j + d[i].first] = f[j] + d[i].second;
        if (j + d[i].second <= x[now]) g[j + d[i].second] = f[j] + d[i].first;
      }
    }
    swap(f, g);
  }
  long long res = -1;
  for (long long i = x[now]; i >= 0; i--)
    if (f[i] != -1) {
      res = f[i];
      break;
    }
  if (res == -1) ans = false;
  return res;
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (long long i = 1; i < n; i++) {
    long long p;
    cin >> p;
    p--;
    G[p].push_back(i);
  }
  for (long long i = 0; i < n; i++) {
    cin >> x[i];
  }
  dfs(0);
  if (ans)
    cout << "Possible" << endl;
  else
    cout << "Impossible" << endl;
}
