#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=300;
int to[N*N],val[N*N],nxt[N*N];
int head[N],dis[N];
bool vis[N];
int tme[N];bool state[N];
int n,m,cnt;
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<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
void add(int u,int v,int d){
cnt++;
val[cnt]=d;
to[cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
}
struct node{
int dis;
int pos;
bool operator <(const node &x )const{
return x.dis<dis;
}
};
priority_queue<node>q;
void dijkstra(int s){
dis[s]=0;
q.push((node){0,s});
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos,d=tmp.dis;
if(state[x]==0)continue;
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(state[y]==0)continue;
if(dis[y]>dis[x]+val[i]){
dis[y]=dis[x]+val[i];
if(!vis[y]){
q.push((node){dis[y],y});
}
}
}
}
}
void init(int t){
for(int i=0;i<n;++i){
dis[i]=1e9;
vis[i]=0;
if(tme[i]<=t)state[i]=1;
}
}
int main(){
n=read();m=read();
for(int i=0;i<n;++i)scanf("%d",&tme[i]);
for(int i=0,u,v,w;i<m;++i){
u=read();v=read();w=read();
add(u,v,w);
add(v,u,w);
}int q;q=read();
init(0);
for(int i=0,x,y,t;i<q;++i){
x=read();y=read();t=read();
init(t);
if(state[x]==0||state[y]==0){
printf("-1\n");continue;
}
dijkstra(x);
if(dis[y]==1e9)printf("-1\n");
else printf("%d\n",dis[y]);
}
return 0;
}
记录