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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 * @author Don Li
 */
public class ApplemanTree {
    
    static final int MOD = (int) (1e9 + 7);
    
    int n;
    int[][] G;
    int[] x;
    
    void solve() {
        n = in.nextInt();
        
        int[] from = new int[n - 1], to = new int[n - 1];
        for (int i = 0; i < n - 1; i++) {
            from[i] = i + 1;
            to[i] = in.nextInt();
        }
        G = build_graph(n, from, to);
        
        x = new int[n];
        for (int i = 0; i < n; i++) x[i] = in.nextInt();
        
        int[][] ret = bfs(G, 0);
        int[] par = ret[0];
        int[] ord = ret[2];
        
        long[][] dp = new long[n][2];
        
        for (int i = n - 1; i >= 0; i--) {
            int u = ord[i];
            dp[u][0] = 1;
            dp[u][1] = 0;
            for (int v : G[u]) {
                if (v != par[u]) {
                    dp[u][1] = dp[u][1] * dp[v][0] % MOD;
                    dp[u][1] = (dp[u][1] + dp[u][0] * dp[v][1] % MOD) % MOD;
                    dp[u][0] = dp[u][0] * dp[v][0] % MOD;
                }
            }
            if (x[u] == 1) dp[u][1] = dp[u][0];
            else dp[u][0] = (dp[u][0] + dp[u][1]) % MOD;
        }
        
        out.println(dp[0][1]);
    }
    
    int[][] bfs(int[][] G, int root) {
        int n = G.length;
        
        int[] par = new int[n];
        Arrays.fill(par, -1);
        
        int[] dep = new int[n];
        dep[0] = 0;
        
        int[] qu = new int[n];
        qu[0] = root;
        for (int l = 0, r = 1; l < r; l++) {
            int u = qu[l];
            for (int v : G[u]) {
                if (v != par[u]) {
                    qu[r++] = v;
                    par[v] = u;
                    dep[v] = dep[u] + 1;
                }
            }
        }
        
        return new int[][]{par, dep, qu};
    }
    
    int[][] build_graph(int n, int[] from, int[] to) {
        int[][] G = new int[n][];
        int[] cnt = new int[n];
        for (int i = 0; i < from.length; i++) {
            cnt[from[i]]++;
            cnt[to[i]]++;
        }
        for (int i = 0; i < n; i++) G[i] = new int[cnt[i]];
        for (int i = 0; i < from.length; i++) {
            G[from[i]][--cnt[from[i]]] = to[i];
            G[to[i]][--cnt[to[i]]] = from[i];
        }
        return G;
    }
    
    public static void main(String[] args) {
        in = new FastScanner(new BufferedReader(new InputStreamReader(System.in)));
        out = new PrintWriter(System.out);
        new ApplemanTree().solve();
        out.close();
    }
    
    static FastScanner in;
    static PrintWriter out;
    
    static class FastScanner {
        BufferedReader in;
        StringTokenizer st;
        
        public FastScanner(BufferedReader in) {
            this.in = in;
        }
        
        public String nextToken() {
            while (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(in.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }
        
        public int nextInt() {
            return Integer.parseInt(nextToken());
        }
        
        public long nextLong() {
            return Long.parseLong(nextToken());
        }
        
        public double nextDouble() {
            return Double.parseDouble(nextToken());
        }
    }
}
