#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxN = 1005;
const int inf = 1e9;
vector<int> adj[mxN];
int dp[mxN][mxN][2], tdp[mxN][2], sz[mxN], val[mxN];
void update(int par, int child){
for(int i = 0; i <= sz[par] + sz[child]; ++i) tdp[i][0] = tdp[i][1] = inf;
for(int i = 0; i <= sz[par]; ++i){
for(int j = 0; j <= sz[child]; ++j){
tdp[i + j][0] = min(tdp[i + j][0], dp[par][i][0] + min(dp[child][j][0], dp[child][j][1]));
tdp[i + j][1] = min(tdp[i + j][1], dp[par][i][1] + min(dp[child][j][0], dp[child][j][1]));
if(i + 1 <= sz[par]){
tdp[i + j + 1][1] = min(tdp[i + j + 1][1], dp[par][i][0] + val[par] + dp[child][j][1]);
}
if(j + 1 <= sz[child]){
tdp[i + j + 1][1] = min(tdp[i + j + 1][1], dp[par][i][1] + val[child] + dp[child][j][0]);
}
if(i + 1 <= sz[par] && j + 1 <= sz[child]){
tdp[i + j + 2][1] = min(tdp[i + j + 2][1], dp[par][i][0] + dp[child][j][0] + val[child] + val[par]);
}
}
}
for(int i = 0; i <= sz[par] + sz[child]; ++i){
for(int j = 0; j <= 1; ++j){
dp[par][i][j] = tdp[i][j];
}
}
}
void dfs(int u = 1, int par = 0){
sz[u] = 1;
dp[u][0][0] = 0, dp[u][0][1] = inf, dp[u][1][0] = inf, dp[u][1][1] = inf;
for(auto it : adj[u]){
if(it ^ par){
dfs(it, u);
}
}
update(par, u);
sz[par] += sz[u];
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr); cout.tie(nullptr);
int n, m, q;
cin >> n >> m;
val[0] = inf;
for(int i = 1; i <= n; ++i) cin >> val[i];
for(int i = 1; i <= m; ++i){
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dp[0][0][0] = 0, dp[0][0][1] = inf, dp[0][1][0] = inf, dp[0][1][1] = inf;
for(int i = 1; i <= n; ++i){
if(!sz[i]) dfs(i, 0);
}
cin >> q;
while(q--){
int ans = 0, s;
cin >> s;
for(int k = n; k >= 0; --k){
if(dp[0][k][0] > s) {
continue;
}else{
ans = k;
break;
}
}
cout << ans << "\n";
}
return 0;
}