#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5, M = 5e3 + 5, mod =1e9 + 7;
int n, m, q, x;
vector<int> e[N];
bool vis[N];
int cnt[N];
int dp[M][M];
void bfs() {
queue<int> Q;
Q.push(x);
vis[x]=true;
int d = 0;
while(Q.size()) {
int t = Q.size();
cnt[d] = t;
while(t--) {
int u = Q.front(); Q.pop();
for(auto v: e[u]) {
if(!vis[v]) {
vis[v] = true;
Q.push(v);
}
}
}
d++;
}
}
void solve() {
cin >> n >> m >> q >> x;
for(int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
bfs();
dp[0][0] = 1;
// dp[i][j] 表示前 i 层的 数字 恰好选择 j 个的方法数量
for(int i = 1; i < M; i++) {
dp[i][0] = 1;
for(int j = 1; j < M; j++) {
dp[i][j] = (dp[i-1][j] + (long long)dp[i-1][j-1] * cnt[i]) % mod;
}
}
while(q--) {
int k;
cin >> k;
cout << dp[M-1][k] << "\n";
}
}
int main() {
cin.tie(0)->sync_with_stdio(0);
solve();
}
// 64 位输出请用 printf("%lld")