#include <bits/stdc++.h>
using namespace std;
#define AC ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef long long ll;
const int N = 205;
int n, m, d[N][N], Q, tme[N];
void folyd (int k) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
d[i][j] = min (d[i][j], d[i][k] + d[k][j]);
}
}
}
struct node {
int t, id, a, b, op;
bool friend operator < (node a, node b) {
if (a.t == b.t) {
return a.op < b.op;
}
return a.t < b.t;
}
} village[60002];
signed main () {
AC;
cin >> n >> m;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
d[i][j] = 1e9;
}
}
for (int i = 0; i < n; i++) {
d[i][i] = 0;
}
for (int i = 0; i < n; i++) {
cin >> village[i].t;
village[i].id = i;
village[i].op = 0;
tme[i] = village[i].t;
}
for (int i = 0; i < m; i++) {
int x, y, w;
cin >> x >> y >> w;
d[x][y] = d[y][x] = min (d[x][y], w);
}
cin >> Q;
for (int i = n; i < Q + n; i++) {
cin >> village[i].a >> village[i].b >> village[i].t;
village[i].op = 1;
}
sort (village, village + n + Q);
for (int i = 0; i < n + Q; i++) {
if (village[i].op == 0) {
folyd(village[i].id);
}
else {
if (village[i].t < tme[village[i].a] || village[i].t < tme[village[i].b] || d[village[i].a][village[i].b] >= 1e9) {
cout << -1 << endl;
}
else {
cout << d[village[i].a][village[i].b] << endl;
}
}
}
return 0;
}