#include<cstdio>
#include<stack>
#include<cstring>
#include<queue>
using namespace std;
const int M=500005;
struct edge{
int u,v,nxt;
}ed[M],en[M];
int head[M],cnt,n,m,st,end[M],p,a[M],w[M];
int dfn[M],low[M],color[M],dex,sum;
int dis[M];
bool vis[M],visi[M],visit[M];
stack<int>s;
inline int read(){
char c=getchar();int x=0;
while(c<'0'||c>'9')c=getchar();
while(c<='9'&&c>='0'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x;
}
inline void add(int u,int v){
ed[++cnt]=(edge){u,v,head[u]};
head[u]=cnt;
}
inline void add_new(int u,int v){
en[++cnt]=(edge){u,v,head[u]};
head[u]=cnt;
}
inline void tarjan(int now){
dfn[now]=low[now]=++dex;
vis[now]=true;
s.push(now);
for(int i=head[now];i;i=ed[i].nxt){
int v=ed[i].v;
if(!dfn[v]){
tarjan(v);
low[now]=min(low[now],low[v]);
}
else if(vis[v]){
low[now]=min(low[now],dfn[v]);
}
}
if(dfn[now]==low[now]){
int t;
sum++;
do{
t=s.top();
s.pop();
color[t]=sum;
vis[t]=false;
}while(t!=now);
}
}
inline void spfa_long(int st){
memset(dis,-1,sizeof(dis));
queue<int>q;
q.push(st);
dis[st]=w[st];
visi[st]=true;
while(!q.empty()){
int u=q.front();
q.pop();
visi[u]=false;
for(int i=head[u];i;i=en[i].nxt){
int v=en[i].v;
if(dis[v]<dis[u]+w[v]){
dis[v]=dis[u]+w[v];
if(!visi[v]){
visi[v]=true;
q.push(v);
}
}
}
}
}
int main(){
n=read();m=read();
for(int i=1;i<=m;i++){
int u=read(),v=read();
add(u,v);
}
for(int i=1;i<=n;i++){
a[i]=read();
}
st=read();p=read();
for(int i=1;i<=p;i++){
end[i]=read();
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i);
}
}
cnt=0;
memset(head,0,sizeof(head));
for(int i=1;i<=m;i++){
int u=ed[i].u,v=ed[i].v;
if(color[u]==color[v]){
if(!visit[u]){
w[color[u]]+=a[u];
visit[u]=true;
}
if(!visit[v]){
w[color[v]]+=a[v];
visit[v]=true;
}
}
else{
add_new(color[u],color[v]);
}
}
spfa_long(color[st]);
int ans=0;
for(int i=1;i<=p;i++){
ans=max(ans,dis[color[end[i]]]);
}
printf("%d",ans);
return 0;
}
真就过不了样例,但真就过了。 求问为什么样例过不了。