#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#pragma GCC optimize(03)
// #pragma GCC target("avx2")
const ll INF = 1e18;
const int MAXN = 5e5;
const int MAXLog = log2(MAXN) + 1;
int n, m;
vector<pair<int, ll>> adj[MAXN+5];
ll dist[MAXN+5];
void Init(int N, int A[], int B[], int D[]) {
n = N;
for(int i = 1; i <= n-1; i++){
int u = A[i-1] + 1, v = B[i-1] + 1, w = D[i-1];
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
}
long long Query(int S, int X[], int T, int Y[]) {
for(int i = 1; i <= n; i++) dist[i] = INF;
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> dijkstra;
for(int i = 0; i < S; i++) dijkstra.push({0ll, X[i] + 1});
while(!dijkstra.empty()){
auto [curDist, cur] = dijkstra.top();
dijkstra.pop();
// cerr << "cur : " << cur << " -> " << curDist << endl;
if(dist[cur] <= curDist) continue;
dist[cur] = curDist;
for(auto [next, weight] : adj[cur]){
if(dist[next] <= dist[cur] + weight) continue;
// cerr << "next : " << next << endl;
dijkstra.push({dist[cur] + weight, next});
}
}
ll ans = INF;
for(int i = 0; i < T; i++) ans = min(dist[Y[i] + 1], ans);
return ans;
}