Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other vertices are colored white.

Consider a set consisting of k (0 ≤ k < n) edges of Appleman's tree. If Appleman deletes these edges from the tree, then it will split into (k + 1) parts. Note, that each part will be a tree with colored vertices.

Now Appleman wonders, what is the number of sets splitting the tree in such a way that each resulting part will have exactly one black vertex? Find this number modulo 1000000007 (109 + 7).

Input

The first line contains an integer n (2 ≤ n ≤ 105) — the number of tree vertices. 

The second line contains the description of the tree: n - 1 integers p0, p1, ..., pn - 2 (0 ≤ pi ≤ i). Where pi means that there is an edge connecting vertex (i + 1) of the tree and vertex pi. Consider tree vertices are numbered from 0 to n - 1.

The third line contains the description of the colors of the vertices: n integers x0, x1, ..., xn - 1 (xi is either 0 or 1). If xi is equal to 1, vertex i is colored black. Otherwise, vertex i is colored white.

Output

Output a single integer — the number of ways to split the tree modulo 1000000007 (109 + 7).

Examples

Input

3
0 0
0 1 1


Output

2


Input

6
0 1 1 0 4
1 1 0 0 1 0


Output

1


Input

10
0 1 2 1 4 4 4 0 8
0 0 0 1 0 1 1 0 0 1


Output

27
import java.util.*;		
import java.util.function.Function;
import java.util.stream.Collectors;
import java.io.*;
import java.math.*;
public class Main{
    static public void main(String args[])throws IOException{
        int tt=1;
        StringBuilder sb=new StringBuilder();
        for(int ttt=1;ttt<=tt;ttt++){
            int n=i();
            int[] p =new int[n-1];
            graph=new ArrayList<>();
            for(int i=0;i<n;i++){
                graph.add(new ArrayList<>());
            }
            for(int i=0;i<n-1;i++){
                p[i]=i();
                graph.get(i+1).add(p[i]);
                graph.get(p[i]).add(i+1);
            }
            color = new int[n];
            for(int i=0;i<n;i++){
                color[i]=i();
            }
            boolean[] visited=new boolean[n];
            dp=new long[n][2];
            dfs(0,visited);
            sb.append(dp[0][1]+"\n");
        }
        System.out.print(sb.toString());
    }
    static long[][] dp;
    static int[] color;
    static void dfs(int node, boolean[] visited) {
        visited[node]=true;
        ArrayList<Integer> ar = graph.get(node);
        long zeroBlack = 1, oneBlack = 0;
        for(int i=0;i<ar.size();i++){
            int num = ar.get(i);
            if(visited[num]==false) {
                dfs(num,visited);
                oneBlack = (oneBlack * dp[num][0])%mod;
                oneBlack = (oneBlack + (dp[num][1]*zeroBlack)%mod)%mod;
                zeroBlack = (zeroBlack * dp[num][0])%mod;
            }
        }
        if(color[node]==1) {
            dp[node][0] = zeroBlack;
            dp[node][1] = zeroBlack;
        } else {
            dp[node][0] = (oneBlack + zeroBlack)%mod;
            dp[node][1] = oneBlack;
        }
    }
    static class Pair{
        int x;
        int y;
        Pair(int x, int y){
            this.x=x;
            this.y=y;
        }
        @Override
        public int hashCode() 
        { 
                final int temp = 14; 
                int ans = 1; 
                ans =x*31+y*13; 
                return (int)ans;
        }
        @Override
         public boolean equals(Object o) 
         { 
             if (this == o) { 
                 return true; 
             } 
             if (o == null) { 
                 return false; 
             } 
             if (this.getClass() != o.getClass()) { 
                 return false; 
             } 
             Pair other = (Pair)o; 
             if (this.x != other.x || this.y!=other.y) { 
                 return false; 
             } 
             return true; 
         }
    } 
    static InputReader in=new InputReader(System.in);
    static OutputWriter out=new OutputWriter(System.out);
    static ArrayList<ArrayList<Integer>> graph;
    static int mod=1000000007;
  //  static class Pair{
  //      int x;
  //      int y;
  //      int z;
   //     Pair(int x,int y,int z){
             /*   this.x=x;
                this.y=y;
                this.z=z; */
    //    }
        /*@Override
        public int hashCode() 
        { 
                final int temp = 14; 
                int ans = 1; 
                ans =x*31+y*13; 
                return (int)ans;
        }
    @Override
     public boolean equals(Object o) 
     { 
         if (this == o) { 
             return true; 
         } 
         if (o == null) { 
             return false; 
         } 
         if (this.getClass() != o.getClass()) { 
             return false; 
         } 
         Pair other = (Pair)o; 
         if (this.x != other.x || this.y!=other.y) { 
             return false; 
         } 
         return true; 
     }*/
  //   }
    public static int[] sort(int[] a){
        int n=a.length;
        ArrayList<Integer> ar=new ArrayList<>();
        for(int i=0;i<a.length;i++){
                ar.add(a[i]);
        }
        Collections.sort(ar);
        for(int i=0;i<n;i++){
                a[i]=ar.get(i);
        }
        return a;
     }
    public static long pow(long a, long b){
        long result=1;
        while(b>0){
            if (b % 2 != 0){
                result=(result*a)%mod;
                b--;
            } 
            a=(a*a)%mod;
            b /= 2;
        }   
        return result;
    }
    public static long gcd(long a, long b){
        if (a == 0){
            return b;
        }
        return gcd(b%a, a);
    }
    public static long lcm(long a, long b){
        return a*(b/gcd(a,b));
    }
    public static long l(){
        String s=in.String();
        return Long.parseLong(s);
    }
    public static void pln(String value){
        System.out.println(value);
    }
    public static int i(){
        return in.Int();
    }
    public static String s(){
        return in.String();
    }
}
class InputReader 
{
    private InputStream stream;
    private byte[] buf = new byte[1024];
    private int curChar;
    private int numChars;
    private SpaceCharFilter filter;
    public InputReader(InputStream stream) {
       this.stream = stream;
    }
    public int read() {
        if (numChars== -1)
            throw new InputMismatchException();
        if (curChar >= numChars) {
            curChar = 0;
            try {
                numChars = stream.read(buf);
            } catch (IOException e) {
                throw new InputMismatchException();
            }
            if (numChars <= 0)
                return -1;
        }
        return buf[curChar++];
    }
    public int Int() {
        int c = read();
        while (isSpaceChar(c))
            c = read();
        int sgn = 1;
        if (c == '-') {
           sgn = -1;
           c = read();
        }
        int res = 0;
        do {
           if (c < '0' || c > '9')
               throw new InputMismatchException();
           res *= 10;
           res += c - '0';
           c = read();
        } while (!isSpaceChar(c));
        return res * sgn;
    }
    public String String() {
        int c = read();
        while (isSpaceChar(c))
            c = read();
        StringBuilder res = new StringBuilder();
        do {
            res.appendCodePoint(c);
            c = read();
        } while (!isSpaceChar(c));
        return res.toString();
    } 
    public boolean isSpaceChar(int c) {
       if (filter != null)
           return filter.isSpaceChar(c);
       return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
    } 
    public String next() {
       return String();
    } 
    public interface SpaceCharFilter {
       public boolean isSpaceChar(int ch);
    }
}
class OutputWriter {
    private final PrintWriter writer;
    public OutputWriter(OutputStream outputStream) {
       writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
    }
    public OutputWriter(Writer writer) {
       this.writer = new PrintWriter(writer);
    }
    public void print(Object...objects) {
       for (int i = 0; i < objects.length; i++) {
           if (i != 0)
               writer.print(' ');
           writer.print(objects[i]);
       }
    }
    public void printLine(Object...objects) {
       print(objects);
       writer.println();
    }
    public void close() {
       writer.close();
    }
    public void flush() {
       writer.flush();
    }
 }
class IOUtils {
    public static int[] readIntArray(InputReader in, int size) {
        int[] array = new int[size];
        for (int i = 0; i < size; i++)
                array[i] = in.Int();
        return array;
    }
} 