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

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class A1098 {
	
	private static class Tree {
		long s;
		long a;
		List<Integer> c = new ArrayList<Integer>();
		int p = -1;
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
//		BufferedReader br = new BufferedReader(new FileReader("F:/books/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		Integer n = Integer.parseInt(br.readLine());
		Tree[] t = new Tree[n];
		for(int i=0;i<n;i++) t[i] = new Tree();
		String[] s1 = br.readLine().split(" ");
		for(int i=1;i<n;i++) {
			Integer p = Integer.parseInt(s1[i-1]);
			t[i].p = p-1;
			t[p-1].c.add(i);
		}
		String[] s2 = br.readLine().split(" ");
		for(int i=0;i<n;i++) t[i].s = Integer.parseInt(s2[i]);
		boolean fl = true;
		long tot = t[0].s;
		for(int i=0;i<n;i++) {
			if(t[i].s<0) {
				if(t[i].c.size()>0) {
					long y = t[i].c.stream()
							.map((x)->t[x].s)
							.reduce(Math::min)
							.orElse(0L);
					t[i].c.stream()
						.forEach((x)->t[x].a = t[x].s-y);
					tot += t[i].c.stream()
							.map((x)->t[x].a)
							.reduce(0L,(a,b)->a+b);
					long x = (t[i].p!=-1)? t[t[i].p].s : 0;
					if(x>y) {
						fl = false;
						break;
					}
					t[i].a = y-x;
				}
				else t[i].a = 0;
				tot += t[i].a;
			}
		}
		if(!fl) System.out.println("-1");
		else System.out.println(tot);
	}

}
