#include <bits/stdc++.h>

using namespace std;

const int nmax = 400009;
const int mod = 1000000007;

pair < int , int > a[nmax];
vector < int > g[nmax];
int dp[nmax];
int n , m , x , y , i;

void mul(int &x , int y)
{
    x = (1LL * x * y) % mod;
}

void dfs(int act)
{
    vector < pair < int , int > > now;
    dp[act] = 1;

    for (int i = 0 ; i < g[act].size() ; ++i)
    {
        int nxt = g[act][i];
        dfs(nxt);
        mul(dp[act] , dp[nxt]);
        if (a[nxt].first) now.push_back(a[nxt]);
    }

    int g0 = g[act].size() , now0 = now.size();

    for (int i = now0 + 1 ; i <= g0 ; ++i)
    mul(dp[act] , i);

    if (now.size() == 0) return;
    sort(now.begin() , now.end());

    if (a[act].first)
    {
        if (a[act].second + 1 == now[0].first);
        else
        dp[act] = 0;

        now.push_back(a[act]);
    }

    sort(now.begin() , now.end());

    for (int i = 0 ; i < now.size() - 1 ; ++i)
    if (now[i].second + 1 != now[i + 1].first)
    dp[act] = 0;

    a[act].first = now[0].first;
    a[act].second = now.back().second;
}

int main()
{

freopen("tree.in" , "r" , stdin);
freopen("tree.out" , "w" , stdout);

scanf("%d" , &n);
scanf("%d" , &m);

for (i = 2 ; i <= n ; ++i)
{
    scanf("%d" , &x);
    g[x].push_back(i);
}

for (i = 1 ; i <= m ; ++i)
{
    scanf("%d" , &x);
    a[x].first = i;
    a[x].second = i;
}

dfs(1);
printf("%d\n" , dp[1]);

return 0;
}
