WA3 WA11
#include <bits/stdc++.h>
#define int long long
#define N 500005
using namespace std;
void read(int& x) {
x = 0;
int f = 1;
char ch = getchar();
while (ch < 48 || ch > 57) {
if (ch == 45) f = -1;
ch = getchar();
}
while (ch >= 48 && ch <= 57) {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
x = x * f;
}
void write(int x) {
if (x < 0) {
putchar(45);
x = -x;
}
if (x > 9) write(x / 10);
putchar(x % 10 + 48);
}
//////////////////////////////////////////////////
int n, m, s, p;
int hd1[N];
int fm1[N << 1];
int to1[N << 1];
int vl1[N];
int br1[N];
int cnt1;
void add1(int x, int y) {
++cnt1;
fm1[cnt1] = hd1[x];
to1[cnt1] = y;
hd1[x] = cnt1;
}
int hd2[N];
int fm2[N << 1];
int to2[N << 1];
int vl2[N];
int br2[N];
int cnt2;
void add2(int x, int y) {
++cnt2;
fm2[cnt2] = hd2[x];
to2[cnt2] = y;
hd2[x] = cnt2;
}
int dfn[N], num;
int st[N], top;
bool in[N];
int low[N];
int cl[N], cln;
void tarjan(int u) {
low[u] = dfn[u] = ++num;
st[++top] = u; in[u] = 1;
for (register int p = hd1[u]; p; p = fm1[p]) {
int v = to1[p];
if (!dfn[v]) {
tarjan(v);
if (low[v] < low[u]) low[u] = low[v];
} else if (dfn[v] && in[v]) {
if (dfn[v] < low[u]) low[u] = dfn[v];
}
}
if (low[u] == dfn[u]) {
int k;
++cln;
do {
k = st[top--];
in[k] = 0;
cl[k] = cln;
vl2[cln] += vl1[k];
if (br1[k]) br2[cln] = 1;
} while (k != u);
}
}
map<int, map<int, bool> >flag;
int rd[N];
void ud() {
for (register int i = 1; i <= n; ++i) {
for (register int p = hd1[i]; p; p = fm1[p]) {
int v = to1[p];
if (cl[i] != cl[v] && !flag[cl[i]][cl[v]]) {
flag[cl[i]][cl[v]] = 1;
add2(cl[i], cl[v]);
++rd[cl[v]];
}
}
}
}
int f[N], ans;
void solve() {
s = cl[s];
f[s] = vl2[s];
queue<int>q;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
if (f[u] > ans && br2[u]) ans = f[u];
for (register int p = hd2[u]; p; p = fm2[p]) {
int v = to2[p];
if (f[v] < f[u] + vl2[v]) f[v] = f[u] + vl2[v];
--rd[v];
if (!rd[v]) q.push(v);
}
}
}
signed main(void) {
read(n); read(m);
for (register int i = 1; i <= m; ++i) {
int x, y;
read(x); read(y);
add1(x, y);
}
for (register int i = 1; i <= n; ++i) read(vl1[i]);
read(s); read(p);
for (register int i = 1; i <= p; ++i) {
int x; read(x);
br1[x] = 1;
}
for (register int i = 1; i <= n; ++i) {
if (!dfn[i]) tarjan(i);
}
ud();
solve();
write(ans);
return 0;
}