#include <bits/stdc++.h>
using namespace std;
class pas {
 public:
  long long x, y;
  pas(long long x = 0, long long y = 0) : x(x), y(y) {}
  pas operator+(pas p) { return pas(x + p.x, y + p.y); }
  pas operator-(pas p) { return pas(x - p.x, y - p.y); }
  pas operator*(long long a) { return pas(x * a, y * a); }
  pas operator/(long long a) { return pas(x / a, y / a); }
  bool operator<(const pas &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const pas &p) const {
    return abs(x - p.x) == 0 && abs(y - p.y) == 0;
  }
};
class Point {
 public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < (1e-10) && fabs(y - p.y) < (1e-10);
  }
};
struct Segment {
  Point p1, p2;
};
double dot(Point a, Point b) { return a.x * b.x + a.y * b.y; }
double cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
bool parareru(Point a, Point b, Point c, Point d) {
  return abs(cross(a - b, d - c)) < (1e-10);
}
double distance_ls_p(Point a, Point b, Point c) {
  if (dot(b - a, c - a) < (1e-10)) return (c - a).absv();
  if (dot(a - b, c - b) < (1e-10)) return (c - b).absv();
  return abs(cross(b - a, c - a)) / (b - a).absv();
}
bool is_intersected_ls(Segment a, Segment b) {
  if (a.p1 == b.p1 || a.p2 == b.p1 || a.p1 == b.p2 || a.p2 == b.p2)
    return false;
  if (parareru((a.p2), (a.p1), (a.p1), (b.p2)) &&
      parareru((a.p2), (a.p1), (a.p1), (b.p1))) {
    if (dot(a.p1 - b.p1, a.p1 - b.p2) < (1e-10)) return true;
    if (dot(a.p2 - b.p1, a.p2 - b.p2) < (1e-10)) return true;
    if (dot(a.p1 - b.p1, a.p2 - b.p1) < (1e-10)) return true;
    if (dot(a.p1 - b.p2, a.p2 - b.p2) < (1e-10)) return true;
    return false;
  } else
    return (cross(a.p2 - a.p1, b.p1 - a.p1) * cross(a.p2 - a.p1, b.p2 - a.p1) <
            (1e-10)) &&
           (cross(b.p2 - b.p1, a.p1 - b.p1) * cross(b.p2 - b.p1, a.p2 - b.p1) <
            (1e-10));
}
double segment_dis(Segment a, Segment b) {
  if (is_intersected_ls(a, b)) return 0;
  double r = distance_ls_p(a.p1, a.p2, b.p1);
  r = min(r, distance_ls_p(a.p1, a.p2, b.p2));
  r = min(r, distance_ls_p(b.p1, b.p2, a.p2));
  r = min(r, distance_ls_p(b.p1, b.p2, a.p1));
  return r;
}
Point intersection_ls(Segment a, Segment b) {
  Point ba = b.p2 - b.p1;
  double d1 = abs(cross(ba, a.p1 - b.p1));
  double d2 = abs(cross(ba, a.p2 - b.p1));
  double t = d1 / (d1 + d2);
  return a.p1 + (a.p2 - a.p1) * t;
}
string itos(long long i) {
  ostringstream s;
  s << i;
  return s.str();
}
long long gcd(long long v, long long b) {
  if (v > b) return gcd(b, v);
  if (v == b) return b;
  if (b % v == 0) return v;
  return gcd(v, b % v);
}
double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
long long pr[2000010];
long long inv[2000010];
long long beki(long long wa, long long rr, long long warukazu) {
  if (rr == 0) return 1ll;
  if (rr == 1) return wa % warukazu;
  if (rr % 2 == 1) return (beki(wa, rr - 1, warukazu) * wa) % warukazu;
  long long zx = beki(wa, rr / 2, warukazu);
  return (zx * zx) % warukazu;
}
void gya() {
  pr[0] = 1;
  for (long long i = 1; i < 2000010; i++) {
    pr[i] = (pr[i - 1] * i) % 1000000007;
  }
  for (long long i = 0; i < 2000010; i++)
    inv[i] = beki(pr[i], 1000000007 - 2, 1000000007);
}
long long par[200100], ranks[200100], kosuu[200100];
void shoki(long long n) {
  for (long long i = 0; i < n; i++) {
    par[i] = i;
    ranks[i] = 0;
    kosuu[i] = 1;
  }
}
long long root(long long x) { return par[x] == x ? x : par[x] = root(par[x]); }
bool same(long long x, long long y) { return root(x) == root(y); }
void unite(long long x, long long y) {
  x = root(x);
  y = root(y);
  long long xx = kosuu[x], yy = kosuu[y];
  if (x == y) return;
  if (ranks[x] < ranks[y]) {
    par[x] = y;
    kosuu[y] = yy + xx;
  } else {
    par[y] = x;
    if (ranks[x] == ranks[y]) ranks[x] = ranks[x] + 1;
    kosuu[x] = yy + xx;
  }
  return;
}
vector<long long> G2[1030];
vector<long long> G[1030];
long long n;
long long a[1020];
long long dp[2][10001];
pas saiki(long long u) {
  if (G[u].size() == 0) {
    return {a[u], 0};
  }
  for (long long i = 0; i < 10001; i++) dp[0][i] = 0, dp[1][i] = 0;
  dp[0][0] = 1;
  long long cn = 0;
  long long sum = 0;
  for (auto v : G[u]) {
    pas w = saiki(v);
    cn ^= 1;
    sum += w.x + w.y;
    for (long long i = 0; i < 10001; i++) dp[cn][i] = 0;
    for (long long i = 5000; i >= 0; i--) {
      if (i - w.x >= 0) dp[cn][i] += dp[1 ^ cn][i - w.x];
      if (i - w.y >= 0) dp[cn][i] += dp[1 ^ cn][i - w.y];
    }
  }
  long long k;
  for (k = a[u]; k >= 0; k--) {
    if (dp[cn][k]) break;
    if (k == 0) {
      cout << "IMPOSSIBLE" << endl;
      exit(1);
    }
  }
  return {a[u], sum - k};
}
signed main() {
  cin >> n;
  for (long long i = 2; i <= n; i++) {
    long long yy;
    cin >> yy;
    G[yy].push_back(i);
  }
  for (long long i = 1; i <= n; i++) cin >> a[i];
  saiki(1);
  cout << "POSSIBLE" << endl;
  return 0;
}
