#include <bits/stdc++.h>
#define se second
#define fi first
#define pb push_back
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
const int maxn = 1e5+5;
const int mod = 1e9+7;
const ll inf = 4e18;
void read()
{
#define name "EXIT"
cin.tie(0)->ios_base::sync_with_stdio(0);cout.tie(0);
if(fopen(name".INP","r")){
freopen(name".INP","r",stdin);
freopen(name".OUT","w",stdout);
}
}
struct canh{
ll u,v,w;
};
ll d[maxn],k,par[maxn],sz[maxn],up[maxn][17],minup[maxn][17],h[maxn];
vector<pll> adj[maxn],tree[maxn];
ll m,n;
void dijkstra(vector<int> source)
{
priority_queue<pll,vector<pll>,greater<pll>> q;
for(int i=1;i<=n;i++){
d[i]=inf;
}
for(auto &it : source){
d[it]=0;
q.push({0,it});
}
while(!q.empty()){
auto [dis,u]=q.top();
q.pop();
if(dis!=d[u]) continue;
for(auto [w,v] : adj[u]){
if(d[v]>d[u]+w){
d[v]=d[u]+w;
q.push({d[v],v});
}
}
}
}
int find_set(int u)
{
if(u!=par[u])return par[u]=find_set(par[u]);
return u;
}
bool join_set(int u, int v)
{
u=find_set(u);v=find_set(v);
if(u==v)return 0;
if(sz[v]>sz[u])swap(u,v);
par[v]=u;
sz[u]+=sz[v];
return 1;
}
void dfs(int u)
{
for(auto [w,v] : tree[u]){
if(v==up[u][0]) continue;
h[v]=h[u]+1;
up[v][0]=u;
minup[v][0]=w;
for(int j=1;j<17;j++){
up[v][j]=up[up[v][j-1]][j-1];
minup[v][j]=min(minup[v][j-1],minup[up[v][j-1]][j-1]);
}
dfs(v);
}
}
ll lca(int u, int v)
{
ll res=inf;
if(h[u]!=h[v]){
if(h[u]<h[v])swap(u,v);
int k=h[u]-h[v];
for(int j=0;j<17;j++){
if(k>>j&1){
res=min(res,minup[u][j]);
u=up[u][j];
}
}
}
if(u==v)return res;
for(int j=16;j>=0;j--){
if(up[u][j]!=up[v][j]){
res=min(res,minup[u][j]);
res=min(res,minup[v][j]);
u=up[u][j];
v=up[v][j];
}
}
res=min(res,minup[u][0]);
res=min(res,minup[v][0]);
return res;
}
signed main()
{
read();
cin>>n>>m;
vector<canh> oldedge,edge;
for(int i=1,u,w,v;i<=m;i++){
cin>>u>>v>>w;
adj[u].pb({w,v});
adj[v].pb({w,u});
oldedge.pb({u,v,w});
}
int k;
cin>>k;
vector<int> bell;
for(int i=1,x;i<=k;i++){
cin>>x;
bell.pb(x);
}
dijkstra(bell);
for(auto [u,v,w] : oldedge){
edge.pb({u,v,min(d[u],d[v])});
}
for(int i=1;i<=n;i++){
par[i]=i;
sz[i]=1;
}
sort(edge.begin(),edge.end(),[](canh &x, canh &y){
return x.w>y.w;
});
for(auto [u,v,w] : edge){
if(join_set(u,v)){
tree[u].pb({w,v});
tree[v].pb({w,u});
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<17;j++){
minup[i][j]=inf;
up[i][j]=0;
}
}
dfs(1);
int q;
cin>>q;
while(q--){
int u,v;
cin>>u>>v;
cout<<lca(u,v)<<"\n";
}
return 0;
}