void solve(){
cin >> N >> M;
DirectedGraph graph(N+1);
rep(i, 0, M){
int u, v; cin >> u >> v;
graph.add_edge(u, v);
}
DirectedGraph dag = graph.getCompressedGraph();
int sz = dag.V;
vector<int> val(sz), DP(sz, -1e9), indeg(sz, 0);
rep(i, 1, N+1){
int X; cin >> X;
val[graph.sccId[i]] += X;
}
int S, P; cin >> S >> P;
S = graph.sccId[S];
DP[S] = val[S];
rep(u, 0, sz) for(auto &v: dag.links[u]) indeg[v]++;
queue<int> Q;
rep(i, 0, sz) if(indeg[i] == 0) Q.push(i);
while(!Q.empty()){
int cur = Q.front(); Q.pop();
for(auto nxt: dag.links[cur]){
DP[nxt] = max(DP[nxt], DP[cur] + val[nxt]);
indeg[nxt]--;
if(indeg[nxt] == 0) Q.push(nxt);
}
}
int ans = 0;
rep(i, 0, P){
int X; cin >> X;
X = graph.sccId[X];
ans = max(ans, DP[X]);
}
cout << ans << '\n';
}