#include<bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using tp = tuple<int, int, int>;
int n, m, k, q;
int main() {
scanf("%d %d", &n, &m);
vector<tp> u(m);
vector<vector<pii>> v(n + 5, vector<pii>());
for (auto &[z, x, y]: u) scanf("%d %d %d", &x, &y, &z), v[x].emplace_back(y, z), v[y].emplace_back(x, z);
scanf("%d", &k);
vector<int> g(k), d(n + 5, 1e9);
priority_queue<pii, vector<pii>, greater<pii>> pq;
for (auto &e: g) scanf("%d", &e), pq.emplace(d[e] = 0, e);
while (!pq.empty()) {
auto [nd, nn] = pq.top(); pq.pop();
for (auto &[tn, td]: v[nn]) if (d[tn] > d[nn] + td) pq.emplace(d[tn] = d[nn] + td, tn);
}
set<int> s;
map<int, int> mp;
vector<int> pos(n + 5);
for (int i = 1; i <= n; i++) s.emplace(d[i]);
int idx = 0;
for (auto e: s) mp[e] = ++idx, pos[idx] = e;
vector<vector<pii>> cu(idx + 5);
for (auto &[z, x, y]: u) cu[mp[min(d[x], d[y])]].emplace_back(x, y);
scanf("%d", &q);
vector<pii> cq(q);
for (auto &[x, y]: cq) scanf("%d %d", &x, &y);
vector<int> l(q, 1), r(q, idx), mid(q);
while (1) {
vector<vector<int>> t(idx + 5, vector<int>());
bool ck = 1;
for (int i = 0; i < q; i++) if (l[i] <= r[i]) mid[i] = (l[i] + r[i]) >> 1, t[mid[i]].emplace_back(i), ck = 0;
if (ck) break;
vector<int> par(n + 5); iota(par.begin(), par.end(), 0);
function<int(int)> fset = [&] (int x) {return (par[x] == x ? x : par[x] = fset(par[x]));};
for (int i = idx; i >= 1; i--) {
for (auto &[x, y]: cu[i]) par[fset(x)] = fset(y);
for (auto &e: t[i]) {
if (fset(cq[e].first) != fset(cq[e].second)) r[e] = mid[e] - 1;
else l[e] = mid[e] + 1;
}
}
}
for (auto &e: r) printf("%d\n", pos[e]);
}