#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n, m, k, Q;
vector<pair<int, int>> adj[100005];
int dist_npp[100005];
vector<int> npps;
void dijkstra_multi_source() {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
fill(dist_npp, dist_npp + n + 1, INF);
for (int npp : npps) {
dist_npp[npp] = 0;
pq.push({0, npp});
}
while (!pq.empty()) {
auto [d, u] = pq.top();
pq.pop();
if (d > dist_npp[u]) continue;
for (auto [v, w] : adj[u]) {
if (dist_npp[u] + w < dist_npp[v]) {
dist_npp[v] = dist_npp[u] + w;
pq.push({dist_npp[v], v});
}
}
}
}
bool can_reach(int s, int t, int min_danger) {
if (dist_npp[s] < min_danger || dist_npp[t] < min_danger) return false;
vector<int> dist(n + 1, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
dist[s] = 0;
pq.push({0, s});
while (!pq.empty()) {
auto [d, u] = pq.top();
pq.pop();
if (u == t) return true;
if (d > dist[u]) continue;
for (auto [v, w] : adj[u]) {
if (dist_npp[v] >= min_danger && dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
pq.push({dist[v], v});
}
}
}
return false;
}
int solve(int s, int t) {
int left = 0, right = INF, ans = 0;
while (left <= right) {
int mid = (left + right) / 2;
if (can_reach(s, t, mid)) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return ans;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b, w;
cin >> a >> b >> w;
adj[a].push_back({b, w});
adj[b].push_back({a, w});
}
cin >> k;
npps.resize(k);
for (int i = 0; i < k; i++) {
cin >> npps[i];
}
dijkstra_multi_source();
cin >> Q;
for (int i = 0; i < Q; i++) {
int s, t;
cin >> s >> t;
cout << solve(s, t) << "\n";
}
return 0;
}