#define _GLIBCXX_DEBUG
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define int long long 

const int MAXN = 1e6;
const int mod =  998244353;


int bin_pow_mod(int a,int n){
    if(n == 0)return 1;
    if(n % 2 == 0){
        int tmp = bin_pow_mod(a,n / 2);
        return (tmp * tmp) % mod;
    }else{
        return (a * bin_pow_mod(a,n - 1)) % mod;
    }
}
int sz[MAXN];
int p[MAXN];

void dfs(int v,std::vector<std::vector<int>>& g,int pred = -1){
    sz[v] = 1;
    p[v] = pred;
    for(int u:g[v]){
        if(u != pred){
            dfs(u,g,v);
            sz[v] += sz[u];
        }
    }
}


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


    int n,k;
    std::cin>>n>>k;


    std::vector<std::vector<int>> g(n);
    std::vector<int> x(k);
    for(int i =0 ;i < k;i++)std::cin>>x[i];

    for(int i = 2;i <= n;i++){
        int p;
        std::cin>>p;
        p--;

      //  std::cout<<i - 1<<' '<<p<<std::endl;
        g[i - 1].push_back(p);
        g[p].push_back(i - 1);
    }

    dfs(0,g);


    int ans = 0;
    std::vector<int> dp(3);
    dp[0] = 1;
    for(int u:g[x[0] - 1]){
        if(u == p[x[0] - 1])continue;
        // std::cout<<sz[u]<<std::endl;
        ans += bin_pow_mod(2,sz[u]);
        ans %= mod;

        int tmp = bin_pow_mod(2,sz[u]);
        tmp--;
        if(tmp < 0)tmp += mod;

        std::vector<int> prev = dp;
        dp[0] = 1;
        dp[1] = (prev[1] + tmp) % mod;
        dp[2] = (prev[1] * tmp % mod + prev[2] * tmp % mod + prev[2]) % mod;
    }
    std::cout<<(ans + dp[2]) % mod;

    

}