#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <climits>
using namespace std;
typedef long long ll;
const int N = 2e6 + 45;
int n, m;
struct edge {
int from;
int to;
int next;
} e[N];
int cnt, head[N];
stack<int> q;
void add(int u, int v) {
cnt++;
e[cnt].from = u;
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
int val[N], A[N], a[N], b[N];
int root, num;
int sccnt, t;
int dfn[N], low[N], siz[N], color[N];
bool vis[N];
int mapp[N];
void tarjan(int u) {
t++;
dfn[u] = low[u] = t;
q.push(u);
vis[u] = true;
for (int i = head[u]; i ; i = e[i].next) {
int v = e[i].to;
if (dfn[v] == 0) {
tarjan(v);
low[u] = min(low[u], low[v]);
} else if (vis[v])
low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
int w;
sccnt++;
do {
w = q.top();
q.pop();
vis[w] = false;
siz[sccnt] ++;
color[w] = sccnt;
val[sccnt] += A[w];
} while (u != w);
}
}
void SPFA(int u) {
queue<int> op;
op.push(u);
vis[u] = true;
mapp[u] += val[u];
while (!op.empty()) {
int x = op.front();
op.pop();
vis[x] = false;
for (int i = head[x] ; i ; i = e[i].next) {
int y = e[i].to;
if (mapp[y] > mapp[x] + val[y]) {
mapp[y] = mapp[x] + val[y];
if (vis[y] == false) {
op.push(y);
vis[y] = true;
}
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &a[i], &b[i]);
add(a[i], b[i]);
}
for (int i = 1; i <= n; i++) {
scanf("%d", &A[i]);
A[i] *= -1;
}
scanf("%d%d", &root, &num);
for (int i = 1; i <= n; i++) {
if (dfn[i] == 0)
tarjan(i);
}
for (int i = 1; i <= cnt; i++) {
e[i].from = 0;
e[i].to = 0;
e[i].next = 0;
head[i] = 0;
}
cnt = 0;
fill(vis, vis + N, 0);
for (int i = 1; i <= m; i ++) {
int x = color[a[i]];
int y = color[b[i]];
if (x != y)
add(x, y);
}
SPFA(color[root]);
int ans = 0;
for (int i = 1; i <= num; i ++) {
int x;
scanf("%d", &x);
ans = min(ans, mapp[color[x]]);
}
printf("%d", -ans);
return 0;
}