求调
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int T,n,m,s,p,w[N],id[N],dfn[N],low[N],scc[N],cnt,in[N];long long tmp[N],maxx,dp[N];bool ins[N];stack<int> stk;vector<int> a[N],A[N],tp;
void dfs(int u)
{
dfn[u]=low[u]=++T,stk.push(u),ins[u]=true;
for(auto v:a[u])
{
if(!dfn[v]) dfs(v),low[u]=min(low[u],low[v]);
else if(ins[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
cnt++;
while(true)
{
int x=stk.top();stk.pop();ins[x]=false;
scc[x]=cnt;
if(x==u) break;
}
}
}
void toposort()
{
queue<int> q;q.push(scc[s]);dp[scc[s]]=w[scc[s]];
while(!q.empty())
{
int u=q.front();q.pop();
for(auto v:a[u]){dp[v]=max(dp[v],dp[u]+w[v]);if(!(--in[v])) q.push(v);}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;scanf("%d%d",&u,&v);
a[u].push_back(v);
}
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
cin>>s>>p;
for(int i=1;i<=p;i++) scanf("%d",&id[i]);
dfs(s);
for(int u=1;u<=n;u++)
{
tmp[scc[u]]+=w[u];
for(auto v:a[u]) if(scc[u]!=scc[v]) A[scc[u]].push_back(scc[v]),in[scc[v]]++;
}
memcpy(w,tmp,sizeof(w));for(int i=1;i<=cnt;i++) a[i]=A[i];
toposort();
for(int i=1;i<=p;i++) maxx=max(maxx,dp[scc[id[i]]]);cout<<maxx;
return 0;
}