#include<bits/stdc++.h>
using namespace std;
int n,m,q,a,b,l,t[205],w,top,v;
int f[205][205];
struct Node{
int a,b,l,m;
}e[40000];
void fl()
{
for(int k = 0;k < n;k ++)
for(int i = 0;i < n;i ++) if(f[i][k] != v)
for(int j = 0;j < n;j ++) if(f[k][j] != v)
f[i][j] = min(f[i][k] + f[k][j],f[i][j]);
}
bool cmp(Node x,Node y)
{
return x.m < y.m;
}
inline void read(int &x)
{
x = 0;
int f = 1;
char s = getchar();
while(s < '0' || s > '9')
{
if(s == '-') f = -1;
s = getchar();
}
while(s >= '0' && s <= '9')
{
x = x * 10 + s - 48;
s = getchar();
}
x *= f;
return;
}
int main()
{
ios::sync_with_stdio(0);
memset(f,0x3f3f3f,sizeof(f));
v = f[1][1];
read(n),read(m);
for(int i = 0;i < n;i ++)
{
read(t[i]);
f[i][i] = 0;
}
for(int i = 1;i <= m;i ++)
{
read(e[i].a),read(e[i].b),read(e[i].l);
e[i].m = max(e[i].a,e[i].b);
}
sort(e + 1,e + 1 + m,cmp);
read(q);
top ++;
while(q --)
{
read(a),read(b),read(w);
while(t[e[top].m] <= w && top <= m)
{
f[e[top].a][e[top].b] = f[e[top].b][e[top].a] = e[top].l;
top ++;
}
fl();
if(f[a][b] == v) cout << -1 << endl;
else cout << f[a][b] << endl;
}
return 0;
}