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.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Solver {

	public static void main(String[] Args) throws NumberFormatException,
			IOException {
		new Solver().Run();
	}

	PrintWriter pw;
	StringTokenizer Stok;
	BufferedReader br;

	public String nextToken() throws IOException {
		while (Stok == null || !Stok.hasMoreTokens()) {
			Stok = new StringTokenizer(br.readLine());
		}
		return Stok.nextToken();
	}

	public int nextInt() throws NumberFormatException, IOException {
		return Integer.parseInt(nextToken());
	}

	public double nextDouble() throws NumberFormatException, IOException {
		return Double.parseDouble(nextToken());
	}

	public long nextLong() throws NumberFormatException, IOException {
		return Long.parseLong(nextToken());
	}

	int n;
	final long del=(long) (1e9+7);
	List<List<Integer>> edges;
	int[] colour;
	boolean[] visited;
	long[] hasOne, hasZero;
	
	void processNode(int curNode){
		if (!visited[curNode]){
			visited[curNode]=true;
			hasOne[curNode]=0;
			hasZero[curNode]=1;
			for (Integer child : edges.get(curNode)){
				if (!visited[child]){
					processNode(child);
					long newOne=(hasZero[curNode]*hasOne[child]+hasOne[curNode]*hasZero[child])%del;
					long newZero=(hasZero[curNode]*hasZero[child])%del;
					hasOne[curNode]=newOne;
					hasZero[curNode]=newZero;
				}
			}
			if (colour[curNode]==1){
				hasOne[curNode]=hasZero[curNode];
			} else {
				hasZero[curNode]=(hasZero[curNode]+hasOne[curNode])%del;
			}
		}
	}
	
	public void Run() throws NumberFormatException, IOException {
		//br = new BufferedReader(new FileReader("input.txt"));pw = new PrintWriter("output.txt");
		br=new BufferedReader(new InputStreamReader(System.in));  pw=new PrintWriter(new OutputStreamWriter(System.out));
		
		n=nextInt();
		edges = new ArrayList<List<Integer>>();
		for (int i=0; i<n; i++){
			edges.add(new ArrayList<Integer>());
		}
		
		colour = new int[n];
		visited = new boolean[n];
		for (int i=0; i<n-1; i++){
			int p = nextInt();
			edges.get(i+1).add(p);
			edges.get(p).add(i+1);
		}
		for (int i=0; i<n; i++){
			colour[i]=nextInt();
		}
		
		hasOne=new long[n];
		hasZero=new long[n];
		
		processNode(0);
		pw.println(hasOne[0]);
		pw.flush();
		pw.close();
	}

}