import java.util.*;
public class Main{
static final int N = 1000005;
static final int mod = 1000000007;
static ArrayList<Integer>[] e = new ArrayList[N];
static int[] dis = new int[N];
static int[] headd = new int[N<<1];
static int[] next = new int[N<<1];
static int[] to = new int[N<<1];
static int cnt = 0;
public static void addage(int u, int v){
cnt ++;
next[cnt] = headd[u];
to[cnt] = v;
headd[u] = cnt;
}
public static void bfs(int now){
int[] queue = new int[N];
int head = 0;
int tail = 0;
queue[tail++] = now;
while(head < tail){
int tmp = queue[head++];
for(int j = headd[tmp]; j > 0; j = next[j]){
int i = to[j];
if(dis[i] != -1) continue;
dis[i] = dis[tmp] + 1;
queue[tail++] = i;
}
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int q = in.nextInt();
int x = in.nextInt();
for(int i = 1; i <= n; i++){
e[i] = new ArrayList<Integer>();
dis[i] = -1;
}
for(int i = 1; i <= m; i++){
int u = in.nextInt();
int v = in.nextInt();
addage(u, v);
addage(v, u);
}
dis[x] = 0;
bfs(x);
int[] a = new int[n+5];
int maxn = 0;
for(int i = 1; i <= n; i++){
if(i == x) continue;
a[dis[i]] ++;
maxn = Math.max(dis[i], maxn);
}
long[] f = new long[5005];
f[0] = 1;
for(int i = 1; i <= maxn; i++){
if(a[i] == 0) continue;
for(int j = 5000; j > 0 ; j--){
f[j] = (f[j] + f[j-1]*a[i]%mod)%mod;
}
}
while(q-- > 0){
int k = in.nextInt();
if(k > maxn){
System.out.println(0);
continue;
}
System.out.println(f[k]);
}
}
}