```cpp
#include <bits/stdc++.h>
using namespace std;
struct edge
{
long long v,dis,next;
}e[120000];
struct army
{
long long p,id,d;
}a[100000];
struct node
{
long long d,p;
}mj[100000],ms[100000];
long long n,m,u,v,w,l=0,r=100000000,ans=0,d[100000],h[100000],id[100000],s[100000],t[100000],sum[100000],book[100000],y[100000],cnt=0,tol=0;
void add_edge(long long u,long long v,long long dis)
{
e[++cnt].next=h[u];
e[cnt].v=v;
e[cnt].dis=dis;
h[u]=cnt;
}
bool cmp1(struct army a,struct army b)
{
return a.id<b.id;
}
bool cmp2(struct army a,struct army b)
{
return a.d>b.d;
}
bool cmp3(struct node a,struct node b)
{
return a.d<b.d;
}
void dfs1(long long now,long long pre)
{
for(int i=h[now];i;i=e[i].next)
if(e[i].v!=pre)d[e[i].v]=d[now]+e[i].dis,id[e[i].v]=id[now],dfs1(e[i].v,now);
}
void dfs2(long long now,long long pre)
{
long long cnt=0;
for(int i=h[now];i;i=e[i].next)
if(e[i].v!=pre)cnt++;
if(cnt==1)
for(int i=h[now];i;i=e[i].next)
if(e[i].v!=pre)t[id[e[i].v]]=e[i].v,dfs2(e[i].v,now);
}
bool check(long long k)
{
long long pj=0,ps=0,h=1,w=1,cu=0;
for(int i=1;i<=tol;i++)book[i]=0;
for(int i=1;i<=m;i++)
if(a[i].d-d[t[a[i].id]]<=k&&a[i].d>k)book[a[i].id]=2;
else if(a[i].d<=k&&book[a[i].id])mj[++pj].d=a[i].d,mj[pj].p=0;
else if(a[i].d<=k&&!book[a[i].id])book[a[i].id]=1,mj[++pj].d=a[i].d,mj[pj].p=a[i].id;
for(int i=1;i<=tol;i++)
if(book[i]==0)ms[++ps].d=d[s[i]],ms[ps].p=0;
else if(book[i]==1)ms[++ps].d=d[s[i]],ms[ps].p=id[s[i]];
if(ps==0)return 1;
sort(mj+1,mj+pj+1,cmp3);
sort(ms+1,ms+ps+1,cmp3);
for(int i=1;i<=ps;i++)y[ms[i].p]=i;
for(int i=1;i<=pj;i++)
if(mj[i].p!=0&&ps-y[mj[i].p]<i)ms[y[mj[i].p]].d=0,mj[i].d=k;
sort(mj+1,mj+pj+1,cmp3);
sort(ms+1,ms+ps+1,cmp3);
w=ps;
while(w>=1)
{
while(mj[h].d+ms[w].d<=k&&h<=pj)h++,cu++;
if(cu==0)return 0;
cu--,w--;
}
return 1;
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n-1;i++)
{
scanf("%lld%lld%lld",&u,&v,&w);
add_edge(u,v,w);add_edge(v,u,w);
}
for(int i=h[1];i;i=e[i].next)d[e[i].v]=e[i].dis,id[e[i].v]=++tol,dfs1(e[i].v,1);
for(int i=h[1];i;i=e[i].next)s[id[e[i].v]]=e[i].v,t[id[e[i].v]]=e[i].v,dfs2(e[i].v,1);
scanf("%lld",&m);
for(int i=1;i<=m;i++)
{
scanf("%lld",&a[i].p);
a[i].id=id[a[i].p];
a[i].d=d[a[i].p];
sum[a[i].id]++;
}
if(m<tol)
{
printf("-1");
return 0;
}
sort(a+1,a+m+1,cmp1);
long long cal=1;
for(int i=1;i<=tol;i++)
{
sort(a+cal,a+sum[i]+cal,cmp2);
cal+=sum[i];
}
while(l<r)
{
long long mid=(l+r)/2;
if(check(mid))ans=mid,r=mid;
else l=mid+1;
}
printf("%lld",ans);
return 0;
}
```
by w9095 @ 2023-07-07 21:25:19