#include<bits/stdc++.h>
using namespace std;
const int N=2e2+1,M=1e5+1;
struct jgt{
int x,y;
bool operator < (const jgt & a) const{
return y>a.y;
}
};
int n,m,q,cnt,x,y,w;
int t[N],flag[M],cc[N],cj[N],dis[N][N][N];
vector<pair<int,int> > lj[N];
priority_queue<jgt> d;
int main(){
scanf("%d%d",&n,&m);
if(n)
for(int i=1;i<=n;i++){
scanf("%d",&t[i]);
if(!flag[t[i]]){
flag[t[i]]=1;
cc[++cnt]=t[i];
}
}
sort(cc+1,cc+cnt+1);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&w);
lj[x+1].push_back({y+1,w});
lj[y+1].push_back({x+1,w});
}
for(int i=1;i<=cnt;i++){
for(int j=1;j<=n;j++){
cj[j]=(t[j]<=cc[i]);
}
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
dis[i][j][k]=INT_MAX;
}
}
for(int j=1;j<=n;j++){
if(!cj[j]){
continue;
}
dis[i][j][j]=0;
d.push({j,0});
while(!d.empty()){
jgt zx=d.top();
d.pop();
if(dis[i][j][zx.x]!=zx.y){
continue;
}
for(int l=0;l<lj[zx.x].size();l++){
if(cj[lj[zx.x][l].first]&&dis[i][j][lj[zx.x][l].first]>dis[i][j][zx.x]+lj[zx.x][l].second){
dis[i][j][lj[zx.x][l].first]=dis[i][j][zx.x]+lj[zx.x][l].second;
d.push({lj[zx.x][l].first,dis[i][j][lj[zx.x][l].first]});
}
}
}
}
}
cin>>q;
for(int i=1;i<=q;i++){
scanf("%d%d%d",&x,&y,&w);
x++,y++;
if(t[x]>w||t[y]>w){
printf("-1\n");
continue;
}
for(int j=cnt;j>=1;j--){
if(w>=cc[j]){
if(dis[j][x][y]!=INT_MAX){
printf("%d\n",dis[j][x][y]);
}
else{
printf("-1\n");
}
break;
}
}
}
return 0;
}