#include <bits/stdc++.h>
using namespace std;
const int N = 205, M = 40005;
int n, m, q, t[N];
struct Edge {
int to, next, w;
Edge() {to = next = w = -1;}
}g[M];
int cnt = 0, head[N];
void add(int u, int v, int w) {
g[++ cnt].next = head[u];
g[cnt].to = v;
g[cnt].w = w;
head[u] = cnt;
}
int dis[N], ver[N];
int dijkstra(int s, int e, int k) {
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > h;
memset(dis, 0x3f, sizeof dis);
memset(ver, 0, sizeof ver);
dis[s] = 0;
h.push({dis[s], s});
while (! h.empty()) {
int d = h.top().second;
h.pop();
if (ver[d])
continue;
for (int i = head[d]; ~ i; i = g[i].next) {
int j = g[i].to;
if ((dis[j] > dis[d] + g[i].w) && k >= t[j]) {
dis[j] = dis[d] + g[i].w;
h.push({dis[j], j});
}
}
ver[d] = 1;
}
if (dis[e] == 0x3f3f3f3f)
return -1;
else
return dis[e];
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i ++)
scanf("%d", &t[i]);
for (int i = 1; i <= m; i ++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
scanf("%d", &q);
while (q --) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
if (t[x] > z || t[y] > z)
printf("-1\n");
else
printf("%d\n", dijkstra(x, y, z));
}
return 0;
}