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
//package test;

import java.util.*;

public class CF1 {
	
	public static final long M = 998244353;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		Node[] arr = new Node[n];
		for(int i=0;i<n;i++)
			arr[i] = new Node();
		for(int i=1;i<n;i++)
		{
			int p = s.nextInt();
			p--;
			arr[p].al.add(arr[i]);
		}
		for(int i=0;i<n;i++)
			arr[i].val = s.nextLong();
		long flag = checkValid(arr[0]);
		/*for(int i=0;i<n;i++)
			System.out.println(arr[i].val);
		*/if(flag==-1)
			System.out.println(flag);
		else
			System.out.println(getSum(arr[0],0));
	}
	
	public static long checkValid(Node root)
	{
		//System.out.println(root.val+"**********");
		long retval = Long.MAX_VALUE;
		for(int i=0;i<root.al.size();i++)
		{
			long val = checkValid(root.al.get(i));
			if(val==-1)
				return val;
			else if(val!=Long.MAX_VALUE && val<root.val)
				return -1;
			else
				retval = Math.min(retval, val);
		}
		//System.out.println(retval+"-------------------");
		if(root.val!=-1)
			return Math.min(retval, root.val);
		else
		{
			if(retval==Long.MAX_VALUE)
			{
				//System.out.println("true");
				root.val = 0;
			}
			else
				root.val = retval;
			return retval;
		}
	}
	
	public static long getSum(Node root, long stn)
	{
		long ans = 0;
		if(!(root.al.size()==0 && root.val==0))	
			ans += root.val-stn;
		for(int i=0;i<root.al.size();i++)
			ans += getSum(root.al.get(i), root.val);
		return ans;
	}
	
	public static class Node{
		long val;
		ArrayList<Node> al;
		
		Node()
		{
			this.val = 0;
			al = new ArrayList<>();
		}
	}
}