/**
* Author: Tran Dang Khoa
**/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#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 MASK(x) (1LL << (x))
#define BIT(x,i) (((x) >> (i)) & 1)
#define sz(x) (int)x.size()
#define all(v) (v).begin(),(v).end()
#define allVector(v, n) (v).begin() + 1, (v).begin() + (n) + 1
#define segleft (id << 1)
#define segright (id << 1 | 1)
#define endl '\n'
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define lb lower_bound
#define ub upper_bound
const int MOD = 1e9+7;
void iofile(string s) {
freopen((s + ".inp").c_str(), "r", stdin);
freopen((s + ".out").c_str(), "w", stdout);
}
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<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 trandkhoa() {
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);
}
dist = dijkstra();
cin >> q;
FOR(i, 1, q) {
int x,y; cin >> x >> y;
cout << min(dist[x], dist[y]);
}
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0);
//iofile("");
int test = 1;
//cin >> test;
while(test--) trandkhoa();
return (0 ^ 0);
}