#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=2e5+34,inf=0x3f3f3f3f;
int t[209],dis[209],vis[209],cnt,idx,tot;
int head[209],to[409],w[409],nex[409];
void addedge(int a,int b,int c){
nex[++idx]=head[a];
head[a]=idx;
w[idx]=c;
to[idx]=b;
}
int Dij(int s,int now_t,int n,int target){
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
if(t[s]>now_t||t[target]>now_t)return -1;
dis[s]=0;
priority_queue<pii,vector<pii>,greater<pii> >que;
que.push({0,s});
while(que.size()){
pii T=que.top();
que.pop();
int u=T.second;
if(vis[u]||t[u]>now_t)continue;
vis[u]++;
for(int i=head[u];i;i=nex[i]){
int v=to[i];
if(dis[v]>dis[u]+w[i]){
dis[v]=dis[u]+w[i];
que.push({dis[v],v});
}
}
}
return dis[target]!=inf?dis[target]:-1;
}
void work(){
int n,m,q,a,b,c;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&t[i]);
while(m--){
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,c);
}
scanf("%d",&q);
while(q--){
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",Dij(a,c,n,b));
}
}
int main()
{
work();
return 0;
}