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.*;
import java.util.*;
//import java.lang.*;
public class SumInTheTree{ 
	static long ans;
	static ArrayList<Integer>[] adj;
	static long[]s;
	public static void main(String[]args)throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n=Integer.parseInt(st.nextToken());
        int[] p=new int[n+1];
        ans=0;
        st = new StringTokenizer(br.readLine());
        for(int i=2;i<=n;i++)p[i]=Integer.parseInt(st.nextToken());
        s =new long[n+1];
    	st = new StringTokenizer(br.readLine());
    	for(int i=1;i<=n;i++)s[i]=Integer.parseInt(st.nextToken());
    	adj=new ArrayList[n+1];
    	for(int i=2;i<=n;i++){
    		if(adj[p[i]]==null)adj[p[i]]=new ArrayList<Integer>();
    		adj[p[i]].add(i);
    	}
    	if(!dfs(1,0,1)){
    		bw.write("-1");bw.close();return;
    	}
    	ans+=s[1];
    	bw.write(ans+"");
    	bw.close();
	}
	private static boolean dfs(int root,long sum,int lvl){
		//if(lvl==1)sum+=s[root];
		if(s[root]<sum && (lvl%2)!=0)return false;
		//else if(s[root]>=sum && (lvl%2)!=0)ans+=(s[root]-sum);
		if(adj[root]==null)return true;
		boolean b=true;
		//System.out.println("root= "+root+"sum== "+sum);
		if((lvl%2)==0){
			int child=0,res=0;long minn=Integer.MAX_VALUE;
			for(int x:adj[root]){
				if(s[x]<sum)return false;
				res+=(s[x]-sum);child++;
				minn=Math.min(minn,s[x]-sum);
			}
			ans+=(res-(child-1)*minn);
		}
		for(int x:adj[root]){
			if(lvl%2==0)b&=dfs(x,sum,lvl+1);
			else b&=dfs(x,s[root],lvl+1);
		}
		return b;
	}
}