#include<bits/stdc++.h>
using namespace std;
const int N=507;
int n,m;
bool done[N];
int tim[N];
int dis[N];
int hd[N];
using pdi=pair<int,int>;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') { if (ch=='-') f=-1;ch=getchar(); }
while (ch>='0'&&ch<='9') { x=x*10+ch-48;ch=getchar(); }
return x*f;
}
inline void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
struct edge{
int wt;
int to,nx;
int usif;
} eg[70000];
void addE(int u,int v,int w,int c){
eg[c].nx=hd[u],hd[u]=c,eg[c].to=v,eg[c].wt=w,eg[c].usif=max(tim[u],tim[v]);
}
void dijkstra(int s,int t,int e) {
if(tim[s]>t||tim[e]>t) return;
dis[s]=0;
priority_queue<pdi> pque;
pque.emplace(0,s);
while(pque.size()) {
pdi pu=pque.top();
pque.pop();
int u=pu.second;
int du=-pu.first;
if(u==e) return;
if(done[u]) continue;
done[u]=true;
for(int i=hd[u];i;i=eg[i].nx) {
if(eg[i].usif>t) continue;
int to=eg[i].to;
int w=eg[i].wt;
if(dis[to]>w+du) {
dis[to]=w+du;
pque.emplace(-dis[to],to);
}
}
}
}
int main() {
n=read(),m=read();
for(int i=0;i<n;++i) cin>>tim[i];
for(int k=1,i,j,w;k<=m;++k) {
i=read(),j=read(),w=read();
addE(i,j,w,k<<2);
addE(j,i,w,k<<2|1);
}
int q;
q=read();
for(int i=0;i<q;++i) {
int x,y,t;
x=read(),y=read(),t=read();
memset(dis,0x3f,sizeof(dis));
memset(done,0,sizeof(done));
dijkstra(x,t,y);
if(dis[y]>=100000000) putchar('-'),putchar('1'),putchar('\n');
else write(dis[y]),putchar('\n');
}
return 0;
}