#include <bits/stdc++.h>
using namespace std;
const long long MAX = 10e5;
vector<long long> graph[MAX];
queue<long long> q;
bool visit[MAX];
long long a[MAX];
long long s[MAX];
long long parent[MAX];
int main() {
  memset(visit, false, sizeof(visit));
  long long nodes;
  cin >> nodes;
  for (auto i = 2; i <= nodes; ++i) {
    long long tmp;
    cin >> tmp;
    parent[i] = tmp;
    graph[i].push_back(tmp);
    graph[tmp].push_back(i);
  }
  for (auto i = 1; i <= nodes; ++i) {
    cin >> s[i];
  }
  a[1] = s[1];
  q.push(1);
  visit[1] = true;
  while (!q.empty()) {
    long long n = q.front();
    q.pop();
    if (n != 1) {
      if (s[n] == -1) {
        s[n] = s[parent[n]];
        if (graph[n].size() > 1) {
          long long mini = 10e9;
          for (auto v : graph[n]) {
            if (v == parent[n]) continue;
            mini = min(mini, s[v]);
          }
          if (mini < s[n]) {
            cout << -1;
            return 0;
          } else {
            a[n] = mini - s[n];
            s[n] = mini;
          }
        } else {
          a[n] = 0;
          s[n] = s[parent[n]];
        }
      } else {
        a[n] = s[n] - s[parent[n]];
      }
    }
    for (auto p : graph[n]) {
      if (visit[p]) continue;
      q.push(p);
      visit[p] = true;
    }
  }
  long long ans = 0;
  for (auto i = 1; i <= nodes; i++) {
    ans += a[i];
  }
  cout << ans;
  return 0;
}
