Mitya has a rooted tree with n vertices indexed from 1 to n, where the root has index 1. Each vertex v initially had an integer number a_v ≥ 0 written on it. For every vertex v Mitya has computed s_v: the sum of all values written on the vertices on the path from vertex v to the root, as well as h_v — the depth of vertex v, which denotes the number of vertices on the path from vertex v to the root. Clearly, s_1=a_1 and h_1=1.

Then Mitya erased all numbers a_v, and by accident he also erased all values s_v for vertices with even depth (vertices with even h_v). Your task is to restore the values a_v for every vertex, or determine that Mitya made a mistake. In case there are multiple ways to restore the values, you're required to find one which minimizes the total sum of values a_v for all vertices in the tree.

Input

The first line contains one integer n — the number of vertices in the tree (2 ≤ n ≤ 10^5). The following line contains integers p_2, p_3, ... p_n, where p_i stands for the parent of vertex with index i in the tree (1 ≤ p_i < i). The last line contains integer values s_1, s_2, ..., s_n (-1 ≤ s_v ≤ 10^9), where erased values are replaced by -1.

Output

Output one integer — the minimum total sum of all values a_v in the original tree, or -1 if such tree does not exist.

Examples

Input


5
1 1 1 1
1 -1 -1 -1 -1


Output


1


Input


5
1 2 3 1
1 -1 2 -1 -1


Output


2


Input


3
1 2
2 -1 1


Output


-1
#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;
bool debug = false;
void debug_true() { debug = true; }
void end(int a = 1) {
  for (int i = 0; i < a; i++) {
    cout << "\n";
  }
}
template <class A>
void print(A a) {
  cout << a << "\n";
}
template <class A, class B>
void print(A a, B b) {
  cout << a << " " << b << "\n";
}
template <class A, class B, class C>
void print(A a, B b, C c) {
  cout << a << " " << b << " " << c << "\n";
}
template <class A, class B, class C, class D>
void print(A a, B b, C c, D d) {
  cout << a << " " << b << " " << c << " " << d << "\n";
}
template <class A, class B, class C, class D, class E>
void print(A a, B b, C c, D d, E e) {
  cout << a << " " << b << " " << c << " " << d << " " << e << "\n";
}
template <class A, class B, class C, class D, class E, class F>
void print(A a, B b, C c, D d, E e, F f) {
  cout << a << " " << b << " " << c << " " << d << " " << e << " " << f << "\n";
}
template <class A>
void print_arr(A a[], int n = 0) {
  for (int i = 0; i < n; i++) {
    cout << a[i] << " ";
  }
  cout << "\n";
}
template <class A>
void print(const vector<A> &a) {
  for (auto x : a) {
    cout << x << " ";
  }
  cout << "\n";
}
template <class A>
void print(const vector<vector<A>> &a) {
  for (auto &x : a) {
    for (auto y : x) {
      cout << y << " ";
    }
    cout << "\n";
  }
  cout << "\n";
}
template <class A>
void in(vector<A> &a) {
  if (a.size() == 0) return;
  for (auto &x : a) {
    cin >> x;
  }
}
template <class A>
void in(vector<vector<A>> &a) {
  int n = a.size();
  if (n == 0) return;
  int m = a[0].size();
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> a[i][j];
    }
  }
}
template <class A>
void print(const set<A> a) {
  for (auto it = a.begin(); it != a.end(); it++) {
    cout << *it << " ";
  }
  cout << "\n";
}
template <class A>
void print(const unordered_set<A> a) {
  for (auto it = a.begin(); it != a.end(); it++) {
    cout << *it << " ";
  }
  cout << "\n";
}
template <class A, class B>
void print(const map<A, B> a) {
  for (auto it = a.begin(); it != a.end(); it++) {
    cout << "(" << it->first << " => " << it->second << ") ";
  }
  cout << "\n";
}
template <class A, class B>
void print(const unordered_map<A, B> a) {
  for (auto it = a.begin(); it != a.end(); it++) {
    cout << "(" << it->first << " => " << it->second << ") ";
  }
  cout << "\n";
}
long long sum_ve(vector<long long> &arr) {
  long long result = 0;
  for (auto x : arr) {
    result += x;
  }
  return result;
}
long long pow_log(long long a, long long b, long long m) {
  a %= m;
  long long res = 1;
  while (b > 0) {
    if (b & 1) res = res * a % m;
    a = a * a % m;
    b >>= 1;
  }
  return res;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long fact(long long a, long long m) {
  if (a == 0)
    return 1;
  else if (a == 1)
    return 1;
  else {
    return (long long)(a * (a + 1) / 2) % m;
  }
}
long long dfs(long long node, long long p, vector<vector<long long>> &grph,
              vector<long long> &s) {
  long long sum = 0;
  if (node == 1) {
    sum = s[1];
  } else if (s[node] != -1) {
    sum = s[node] - s[p];
  } else {
    long long req = 1e9 + 5;
    bool isleaf = 1;
    for (long long i = 0; i < grph[node].size(); i++) {
      long long neigh = grph[node][i];
      if (neigh == p) continue;
      if (s[neigh] - s[p] < 0) return -1;
      req = min(req, s[neigh] - s[p]);
      isleaf = 0;
    }
    if (!isleaf) {
      s[node] = s[p] + req;
      sum += req;
    } else {
      s[node] = s[p];
    }
  }
  for (long long i = 0; i < grph[node].size(); i++) {
    long long neigh = grph[node][i];
    if (neigh == p) continue;
    long long tt = dfs(neigh, node, grph, s);
    if (tt == -1)
      return -1;
    else
      sum += tt;
  }
  return sum;
}
void program() {
  debug = true;
  long long n;
  cin >> n;
  vector<vector<long long>> grph(n + 1);
  for (long long i = 2; i <= n; i++) {
    long long p;
    cin >> p;
    grph[p].push_back(i);
    grph[i].push_back(p);
  }
  vector<long long> s(n + 1);
  for (long long i = 1; i <= n; i++) {
    cin >> s[i];
  }
  print(dfs(1, -1, grph, s));
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  program();
  return 0;
}
