#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
//#define int ll
using P = pair<int, int>;
using PL = pair<ll, int>;
#define all(x) x.begin(), x.end()
#define rep(i, l, n) for (int i = l; i < (n); ++i)
#define sz(x) (int)x.size()
const char nl = '\n';
const ll NMAX = 5e5+10;
const ll inf = NMAX*(ll)1e9;
vector<P> g[NMAX];
ll d[NMAX];
int specific[NMAX], NN;
void Init(int N, int A[], int B[], int D[]) {
NN = N;
rep(i, 0, N-1)
g[A[i]].push_back({B[i], D[i]}),
g[B[i]].push_back({A[i], D[i]});
}
long long Query(int S, int X[], int T, int Y[]) {
//cout << inf << nl;
rep(i, 0, NN)d[i] = inf, specific[i] = 0;
rep(i, 0, T)specific[Y[i]] = 1;
priority_queue<PL, vector<PL>, greater<PL>> pq;
rep(i, 0, S) {
pq.push({0, X[i]});
d[X[i]] = 0;
}
while (!pq.empty()) {
auto [dist, nd] = pq.top(); pq.pop();
if (d[nd] != dist)continue;
if (specific[nd])return dist;
for (auto [son, w]: g[nd])
if (dist+w < d[son])
d[son] = dist+w,
pq.push(P(d[son], son));
}
ll mn = inf;
rep(i, 0, T)mn = min(mn, d[Y[i]]);
//assert(1==0);
return mn;
}