#include <bits/stdc++.h>
using namespace std;
int n, level;
priority_queue<pair<int, int>, vector<pair<int, int> >,
               greater<pair<int, int> > >
    t[100010];
int sum[100010], parent[100010], a[100010];
long long ans;
void dfs(int actual) {
  level++;
  if (!(level & 1)) {
    if (!t[actual].empty()) {
      sum[actual] = t[actual].top().first;
    } else {
      sum[actual] = sum[parent[actual]];
    }
  }
  if (actual != 1 && sum[actual] < sum[parent[actual]]) {
    cout << -1 << '\n';
    exit(0);
  }
  if (actual != 1) {
    a[actual] = sum[actual] - sum[parent[actual]];
  }
  while (!t[actual].empty()) {
    dfs(t[actual].top().second);
    t[actual].pop();
  }
  level--;
  ans += a[actual];
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  parent[1] = -1;
  cin >> n;
  for (int i = 2; i <= n; i++) {
    cin >> parent[i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> sum[i];
  }
  for (int i = 2; i <= n; i++) {
    t[parent[i]].push({sum[i], i});
  }
  a[1] = sum[1];
  dfs(1);
  cout << ans << '\n';
  return 0;
}
