#include<bits/stdc++.h>
#define int long long
using namespace std;
int inf=1e18;
struct node{
int ar[3];
node(){
ar[0]=ar[1]=ar[2]=inf;
}
};
int d[1005];
int p[1005];
vector<int>adj[1005];
vector<node>dp[1005];
int sz[1005];
int state[3][3]={
{0,0,0},
{1,2,2},
{2,2,2}
};
int add[3][3]={
{0,0,0},
{0,2,1},
{0,1,0}
};
int fp(int a){
if(p[a]==a)return a;
return p[a]=fp(p[a]);
}
void un(int a,int b){
p[fp(a)]=fp(b);
}
void merge(int a,int b){
int n=dp[a].size()+dp[b].size();
vector<node>temp(n,node());
for(int i=0;i<dp[a].size();i++)for(int j=0;j<dp[b].size();j++){
for(int k=0;k<3;k++)for(int l=0;l<3;l++){
if(dp[a][i].ar[k]==inf||dp[b][j].ar[l]==inf)continue;
int go=i+j+add[k][l];
temp[go].ar[state[k][l]]=min(temp[go].ar[state[k][l]],dp[a][i].ar[k]+dp[b][j].ar[l]);
}
}
dp[a]=temp;
}
void dfs(int u,int p){
//cerr<<"u:"<<u<<"\n";
dp[u].push_back(node());
dp[u][0].ar[0]=0;
dp[u][0].ar[1]=d[u];
dp[u][0].ar[2]=inf;
dp[u].push_back(node());
dp[u][1].ar[0]=inf;
dp[u][1].ar[1]=inf;
dp[u][1].ar[2]=inf;
for(auto x:adj[u])if(x!=p){
dfs(x,u);
merge(u,x);
}
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,m;cin>>n>>m;
int sum=0;
for(int i=1;i<=n;i++)cin>>d[i],p[i]=i,sum+=d[i];
//cerr<<"sum:"<<sum<<"\n";
for(int i=0;i<m;i++){
int a,b;cin>>a>>b;
adj[a].push_back(b);
adj[b].push_back(a);
un(a,b);
}
for(int i=1;i<=n;i++){
if(fp(i)==i){
//cerr<<"i:"<<i<<"\n";
adj[0].push_back(i);
adj[i].push_back(0);
}
}
dfs(0,-1);
vector<int>val;
int mn=inf;
for(int i=0;i<=n;i++){
if(i==1)val.push_back(0);
else val.push_back(dp[0][i].ar[0]);
}
//for(int i=n;i>=0;i--)val[i]=min(val[i],mn),mn=min(mn,val[i]);
//for(auto x:val)cerr<<x<<" ";
//cerr<<"\n";
int q;cin>>q;
for(int i=0;i<q;i++){
int x;cin>>x;
int id=upper_bound(val.begin(),val.end(),x)-val.begin()-1;
if(id==1)id=0;
cout<<id<<"\n";
}
}