#include "factories.h"
#include <bits/stdc++.h>
//#pragma GCC optimize("O3")
//#pragma GCC optimize("unroll-loops")
#define ll long long
#define endl '\n'
#define pb push_back
#define fi first
#define se second
#define pii pair<int, int>
using namespace std;
vector<pii> mas[500001];
ll kr[500001], best;
//vector<int> eil[5e5];
//int tin[5e5], tout[5e5], t=0;
//void dfs(int v, int p)
//{
// tin[v]=++t;
// eil.pb(v);
// for(auto x:mas[v])
// if(x.fi!=p)
// dfs(x.fi, v);
// tout[v]=++t;
// eil.pb(v);
//}
pair<ll, ll> dfs(int v, int p)
{
ll dp1=LLONG_MAX, dp2=LLONG_MAX;
if(kr[v]==1)
dp1=0ll;
else if(kr[v]==2)
dp2=0ll;
for(auto x:mas[v])
{
if(x.fi==p)
continue;
auto u=dfs(x.fi, v);
dp1=min(dp1, u.fi+x.se);
dp2=min(dp2, u.se+x.se);
}
best=min(best, dp1+dp2);
return {dp1, dp2};
}
void Init(int N, int A[], int B[], int D[]) {
for(int i=0; i<N; i++)
{
mas[A[i]].pb({B[i], D[i]});
mas[B[i]].pb({A[i], D[i]});
}
}
long long Query(int S, int X[], int T, int Y[]) {
// eil.clear();
// dfs(1, 1);
for(int i=0; i<S; i++)
kr[X[i]]=1;
for(int i=0; i<T; i++)
kr[Y[i]]=2;
best=LLONG_MAX;
dfs(0, 0);
for(int i=0; i<S; i++)
kr[X[i]]=0;
for(int i=0; i<T; i++)
kr[Y[i]]=0;
return best;
}