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

using namespace std;
#define int long long

const int mod = 998244353 ;

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 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);
    }
}
vector<int> order;

const int maxn = 1e6 + 6;
vector<int> g[maxn];
int cnt[maxn] , sz[maxn] , ch[maxn] , ans[maxn];
int otv = 0;
void dfs2(int v , int p) {
    for(auto u : g[v]) {
        if (u != p) {
            dfs2(u , v);
        }
    }
    order.push_back(v);
}
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;
        otv = add(add(otv , -1) , bp(2 , sz[v] - 1));
        for(auto u : g[v]) {
            otv = add(otv , -sz[u]);
        }
    } else {
        ans[v] = cc;
    }
}

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

    int n , k;
    cin >> n >> k;
    int t ;
    for(int i = 0 ; i < k ; i++) {
        int x;
        cin >> x;
        x--;
        t = 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++) {
        dfs2(i , -1);
    }
    reverse(order.begin(),order.end());
    for(auto i : order) {
        dfs(t , -1 , 1);
    }
    int x = 1;
    for(int i = 0 ; i < n ; i++) {
        x = umn(x , ans[i]);
    }
    cout << x;
 }
