/**
* Author: L?u Di?p Th�nh (Save Di?p Th�nh)
* Le Hong Phong High School for the Gifted (i2528)
**/
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define ll long long
#define ushort unsigned short
#define FOR(i,l,r) for(int i = (l), _r = (r); i <= _r; i++)
#define FORN(i,r,l) for(int i = (r), _l = (l); i >= _l; i--)
#define endl '\n'
#define sz(x) (int)x.size()
#define fi first
#define se second
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define MASK(x) (1LL << (x))
#define BIT(x,i) (((x) >> (i)) & 1)
#define ins insert
#define segleft (id<<1)
#define segright (id<<1|1)
#define TIME (1.0 * clock() / CLOCKS_PER_SEC)
const int MOD = 1e9+7;
struct DSU {
vector<int> par, num;
int n;
DSU() {}
void init(int _n) {
n = _n;
par.assign(n+5, 0);
num.assign(n+5, 0);
iota(all(par), 0);
fill(all(num), 1);
}
int findpar(int u) {
return (par[u] == u ? u : par[u] = findpar(par[u]));
}
bool unite(int u, int v) {
u = findpar(u);
v = findpar(v);
if (u==v) return false;
if (num[u] < num[v]) swap(u,v);
par[v] = u;
num[u] += num[v];
return true;
}
};
struct infoQuery {
int a,b;
};
struct infoMid {
int mid, a, b, id;
};
const int INF = LLONG_MAX;
const int N = 2e5+5;
vector<pair<int,int>> edge[N];
vector<infoQuery> query(N);
vector<infoMid> can;
vector<int> dist, npp;
int n,m,k,q;
vector<int> dijkstra() {
vector<int> dist(n+5, INF);
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> q;
for(int u : npp) {
q.push({0, u});
dist[u] = 0;
}
while(!q.empty()) {
auto[du, u] = q.top(); q.pop();
if (du != dist[u]) continue;
for(auto[v,w] : edge[u]) {
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
q.push({dist[v], v});
}
}
}
return dist;
}
void Semicolon() {
cin >> n >> m;
FOR(i, 1, m) {
int u,v,w; cin >> u >> v >> w;
edge[u].pb({v,w});
edge[v].pb({u,w});
}
cin >> k;
FOR(i, 1, k) {
int x; cin >> x;
npp.pb(x);
}
cin >> q;
FOR(i, 1, q) {
int x,y; cin >> x >> y;
query[i] = {x,y};
}
dist = dijkstra();
vector<int> order(n+1);
iota(order.begin()+1, order.end(), 1);
sort(order.begin()+1, order.end(), [](int &a, int &b) {
return dist[a] > dist[b];
});
vector<int> l(q+5, 0), r(q+5, 1e10), ans(q+5, -1);
DSU dsu;
dsu.init(n);
bool flag = true;
while(flag) {
flag = false;
FOR(i, 1, q) {
if (l[i] > r[i]) continue;
int mid = (l[i] + r[i])>>1;
can.pb({mid, query[i].a, query[i].b, i});
flag = true;
}
if (!flag) break;
sort(all(can), [](infoMid &x, infoMid &y) {
return x.mid > y.mid;
});
int j = 0;
FOR(i, 1, n) {
int u = order[i];
for(auto[v,w] : edge[u]) {
if (dist[v] >= dist[u]) dsu.unite(u,v);
}
while(j < sz(can) && can[j].mid > dist[u]) {
infoMid cur = can[j];
r[cur.id] = cur.mid-1;
j++;
}
int nxtdist = (i==n ? -1 : dist[order[i+1]]);
while(j < sz(can) && can[j].mid <= dist[u] && can[j].mid > nxtdist) {
infoMid cur = can[j];
if (dsu.findpar(cur.a) == dsu.findpar(cur.b)) {
ans[cur.id] = cur.mid;
l[cur.id] = cur.mid+1;
} else {
r[cur.id] = cur.mid-1;
}
j++;
}
}
vector<infoMid>().swap(can);
dsu.init(n);
}
FOR(i, 1, q) {
cout << ans[i] << endl;
}
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0);
//freopen("", "r", stdin);
//freopen("", "w", stdout);
if (fopen("input.txt", "r")) freopen("input.txt", "r", stdin);
int t = 1;
//cin >> t;
while(t--) Semicolon();
cerr << endl;
cerr << "Time elapsed: " << TIME << " s.\n ";
return (0 ^ 0);
}