#include using namespace std; static const int MAXN = 100009; int n; vector> gr[MAXN]; int dist[MAXN]; void init() { int m; scanf("%d %d", &n, &m); for (int i = 0; i < m; i++) { int from, to, w; scanf("%d %d %d", &from, &to, &w); gr[from].push_back({to, w}); gr[to].push_back({from, w}); } } void solve() { fill(dist, dist + n, INT_MAX); int k; scanf("%d\n", &k); set> q; for (int i = 0; i < k; i++) { int a; scanf("%d", &a); dist[a] = 0; q.insert({0, a}); } while (q.empty() == false) { int node = (*q.begin()).second; q.erase(q.begin()); for (pair edge : gr[node]) { int to = edge.first; int val = edge.second; if (dist[to] > dist[node] + val) { q.erase({dist[to], to}); dist[to] = dist[node] + val; q.insert({dist[to], to}); } } } } void answerQs() { int q; scanf("%d", &q); for (int i = 0; i < q; i++) { int a; scanf("%d", &a); printf("%d\n", dist[a]); } } int main(){ init(); solve(); answerQs(); return 0; }