#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e6 + 5;
const ll MOD = 1e9 + 7;
vector<vector<ll>> adj(N);
vector<ll> vis(N, -1);
ll c[5001];
ll dm = 0;
void bfs(ll x) {
queue<ll> q;
q.push(x);
while (!q.empty()) {
ll t = q.front();
q.pop();
for (auto it : adj[t]) {
if (vis[it] == -1) {
vis[it] = vis[t] + 1;
dm = max(dm, vis[it]);
c[vis[it]]++;
q.push(it);
}
}
}
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
ll n, m, q, x;
cin >> n >> m >> q >> x;
for (ll i = 1; i <= m; i++) {
ll u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vis[x] = 0;
bfs(x);
// --- 01 背包 DP 部分 ---
// f[j] 表示选 j 个锚点的方案数
vector<ll> f(5001, 0);
f[0] = 1; // 初始化:选0个点的方案数为1
// 遍历每一层(距离 d)
for (ll d = 1; d <= dm; d++) {
if (c[d] == 0) continue; // 这一层没节点,跳过
// 01背包倒序遍历,防止重复选择同一层
// k最大是5000,所以直接遍历到5000
for (ll j = 5000; j >= 1; j--) {
f[j] = (f[j] + f[j-1] * c[d]) % MOD;
}
}
// 处理询问
while (q--) {
ll k;
cin >> k;
cout << f[k] << '\n';
}
return 0;
}