#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>

using namespace std;
#define int long long

const int mod = 998244353 , mod2 = 1e9 + 13;

int umn(int a , int b) {
    return ((a * b) % mod + mod) % mod;
}
int add(int a , int b) {
    return ((a + b) % mod + mod) % mod;
}
int umn2(int a , int b) {
    return ((a * b) % mod2 + mod2) % mod2;
}
int mn(int a , int b) {
    return ((a - b) % mod + mod) % mod;
}

int bp(int a , int p) {
    if(p == 0)return 1;
    if(p % 2 == 0) {
        int x = bp(a , p / 2);
        return umn(x , x);
    } else {
        return umn(bp(a , p - 1) , a);
    }
}

const int maxn = 1e6 + 6;
vector<int> g[maxn];
int cnt[maxn] , sz[maxn] , ch[maxn] , ans[maxn];

void dfs(int v , int p , int cc) {
    sz[v] = 1;
    if(ch[v]) cc++;
    for(auto u : g[v]) {
        if(u != p) {
            dfs(u , v , cc);
            sz[v] += sz[u];
        }
    }
    if(ch[v]) {
        ans[v] = 1;
    } else {
        ans[v] = cc;
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n , k;
    cin >> n >> k;
    for(int i = 0 ; i < k ; i++) {
        int x;
        cin >> x;
        x--;
        ch[x] = 1;
    }
    for(int i = 1 ; i < n ; i++) {
        int x;
        cin >> x;
        x--;
        g[i].push_back(x);
        g[x].push_back(i);
    }
    for(int i = 0 ; i < n ; i++) {
        dfs(i , -1 , 1);
    }
    int x = 1;
    for(int i = 0 ; i < n ; i++) {
        x = umn(x , ans[i]);
    }
    cout << x;
 }
