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.util.*;

public class r530d {
	static ArrayList<Integer>[] a;
	static long[] data;
	static long[] min;
	static final long oo=Long.MAX_VALUE/2-5;
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		a=new ArrayList[n];
		for(int i=0;i<n;i++) a[i]=new ArrayList<>();
		for(int i=1;i<n;i++) {
			int v=scan.nextInt()-1;
			a[v].add(i);
		}
		data=new long[n];
		for(int i=0;i<n;i++) data[i]=scan.nextInt();
		min=new long[n];//min[i]=min s[i] in subtree of i
		for(int i=0;i<n;i++) {
			min[i]=data[i]==-1?Integer.MAX_VALUE:data[i];
		}
		precomp(0);
//		System.out.println(Arrays.toString(min));
		long x=go(0,-1,0);
		if(x==oo) System.out.println(-1);
		else System.out.println(x);
	}
	public static long precomp(int at) {
		for(int nxt:a[at]) {
			long x=precomp(nxt);
			if(x!=-1) min[at]=Math.min(min[at],x);
		}
		return min[at];
	}
	public static long go(int at, int par, long prevVal) {
		if(a[at].size()==0) {
			if(data[at]==-1) return 0;
			if(data[at]-prevVal<0) return oo;
			return data[at]-prevVal;
		}
		long res;
		if(data[at]==-1) {
			res=min[at]-data[par];
//			System.out.println(1);
//			System.out.println("giving "+res+" to "+at);
			if(res<0) return oo;
			for(int nxt:a[at]) {
				long x=go(nxt,at,min[at]-data[par]+prevVal);
				if(x==oo) return oo;
				res+=x;
			}
		}
		else {
			res=data[at]-prevVal;
//			System.out.println(2);
//			System.out.println("giving "+res+" to "+at);
			if(res<0) return oo;
			for(int nxt:a[at]) {
				long x=go(nxt,at,data[at]);
				if(x==oo) return oo;
				res+=x;
			}
		}
		return res;
	}
}