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.IOException;
import java.io.InputStream;
import java.util.*;

public class OOP {
    static int ans;

    public static void main(String[] args) throws Exception {
        FastIO io = new FastIO(System.in);
        int n = io.nextInt();
        Tree t = new Tree(n);

        t.tree[0]=new Nodes(0,0);
        for (int i = 1; i < n; i++) {
            int p = io.nextInt() - 1;
            t.tree[i] = new Nodes(i,p);
            t.tree[p].add_child(i);
        }
        long s[] = new long[n];
        long a[] = new long[n];

        for (int i = 0; i < n; i++)
            s[i] = io.nextLong();

        a[0] = s[0];
        boolean traversed[] = new boolean[n];
        Queue<Nodes> queue = new LinkedList<>();
        queue.add(t.tree[0]);
        long curr_s = 0;
        while (!queue.isEmpty()) {
            Nodes curr = queue.poll();
            if (!traversed[curr.val])
                for(int i=0;i<curr.childs.size();i++)
                    queue.add(t.tree[curr.childs.get(i)]);

                if(s[curr.val] ==-1) {
                    //System.out.println("lol");
                    long min = Integer.MAX_VALUE;
                    for (int i = 0; i < curr.childs.size(); i++)
                        min = Math.min(min, s[curr.childs.get(i)]);
                    s[curr.val] = min == Integer.MAX_VALUE ? s[curr.parent] : min;
                    if (s[curr.val] < s[curr.parent]) {
                        System.out.println(-1);
                        return;
                    }
                   // System.out.println("which  node? " + curr.val);
                   // System.out.println("curr_s? " + Arrays.toString(s));
                    //System.out.println("which  node? " + curr.val);

                    a[curr.val] = s[curr.val] - s[curr.parent];
                    for (int i = 0; i < curr.childs.size(); i++)
                        a[curr.childs.get(i)] = s[curr.childs.get(i)] - s[curr.val];
                }


            traversed[curr.val] = true;
        }
    long sum =0;
       // System.out.println(Arrays.toString(a));
        for(int i=0;i<n;i++)
            sum += a[i];
        System.out.println(sum);
    }
}


class Tree{
    Nodes tree[];
    Tree(int n){
        tree = new Nodes[n];

    }
}
class Nodes{
    int parent ;
    int val;
    ArrayList <Integer>childs;

    Nodes(int v,int p){
        val = v;
        parent = p;
        childs =new ArrayList<>();
    }
    void add_child(int c){
        childs.add(c);
    }
}


class FastIO{

    byte[] buf = new byte[2048];
    int index, total;
    InputStream in;

    FastIO(InputStream is) {
        in = is;
    }

    int scan() throws IOException {
        if (index >= total) {
            index = 0;
            total = in.read(buf);
            if (total <= 0) {
                return -1;
            }
        }
        return buf[index++];
    }

    String next() throws IOException {
        int c;
        for (c = scan(); c <= 32; c = scan());
        StringBuilder sb = new StringBuilder();
        for (; c > 32; c = scan()) {
            sb.append((char) c);
        }
        return sb.toString();
    }

    int nextInt() throws IOException {
        int c, val = 0;
        for (c = scan(); c <= 32; c = scan());
        boolean neg = c == '-';
        if (c == '-' || c == '+') {
            c = scan();
        }
        for (; c >= '0' && c <= '9'; c = scan()) {
            val = (val << 3) + (val << 1) + (c & 15);
        }
        return neg ? -val : val;
    }

    long nextLong() throws IOException {
        int c;
        long val = 0;
        for (c = scan(); c <= 32; c = scan());
        boolean neg = c == '-';
        if (c == '-' || c == '+') {
            c = scan();
        }
        for (; c >= '0' && c <= '9'; c = scan()) {
            val = (val << 3) + (val << 1) + (c & 15);
        }
        return neg ? -val : val;
    }
}