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 p1098A {
    static class Pair{
        int i;
        int j;
        Pair(int i,int j){
            this.i=i;
            this.j=j;
          
        }  
    }
    public static void main(String[] args) {
        Scanner scn=new Scanner(System.in);
        int n=scn.nextInt();
        ArrayList<ArrayList<Integer>> arr=new ArrayList<ArrayList<Integer>>();
        for(int i=0;i<n;i++){
            arr.add(new ArrayList<Integer>());
        }
        int[] par=new int[n-1];
        for(int i=0;i<n-1;i++){
            int val=scn.nextInt();
            val--;
            par[i]=val;
            arr.get(i+1).add(val);
            arr.get(val).add(i+1);
        }
        int[] sum=new int[n];
        for(int i=0;i<n;i++){
            sum[i]=scn.nextInt();
        }
        int[] vis=new int[n];
        int[] ans=new int[n];
        int val=bfs(arr,ans,vis,sum,par);
        if(val==1){
            System.out.println(-1);
        }
        else{
            long c=0;
            for(int i=0;i<n;i++){
                c=c+ans[i];
            }
            System.out.println(c);
        }
    }
    public static int bfs(ArrayList<ArrayList<Integer>> arr,int[] ans,int[] vis,int[] sum,int par[]){
        ArrayDeque<Pair> qu=new ArrayDeque<Pair>();
        qu.add(new Pair(0,1));
        ans[0]=sum[0];
        int tog=0;
        while(qu.size()>0){
            Pair p=qu.remove();
            vis[p.i]=1;
            if((p.j)%2==0){
                if(arr.get(p.i).size()==1){
                    ans[p.i]=0;
                }
                else{
                    int min=Integer.MAX_VALUE;
                    for(int i:arr.get(p.i)){
                        if(vis[i]==1){
                            continue;
                        }
                        if(sum[par[p.i-1]]>sum[i]){
                            tog=1;
                            break;
                        }
                        min=Math.min(min,sum[i]-sum[par[p.i-1]]);
                        qu.add(new Pair(i,p.j+1));
                    }
                    ans[p.i]=min;
                    for(int i:arr.get(p.i)){
                        if(vis[i]==1){
                            continue;
                        }
                        ans[i]=-min+sum[i]-sum[par[p.i-1]];
                    }
                    
                }
            }
            else{
                for(int i:arr.get(p.i)){
                    if(vis[i]==1){
                        continue;
                    }
                    qu.add(new Pair(i,p.j+1));
                }
            }
            if(tog==1){
                break;
            }   
        }
        return(tog);
    }
}
