洛谷A了,别的站上T飞
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline void print(int x){
static int s[20],t=0;
do s[++t]=x%10,x/=10;while(x);
while(t) putchar(s[t--] + '0');
}
const int N=5e5+5;
struct edge{
int v,w;
};
int n,k;
int sz[N],sm[N];
int f[N][2],as[N];
int vis[N],son[N];
vector<edge> g[N];
void dfs1(int u,int fa){
sz[u]=vis[u],sm[u]=0;
for(edge i:g[u]){
int v=i.v,w=i.w;
if(v==fa)continue;
dfs1(v,u);
if(sz[v]){
sm[u]+=sm[v]+(w<<1);
if(f[v][0]+w>=f[u][0])
f[u][1]=f[u][0],f[u][0]=f[v][0]+w,son[u]=v;
else if(f[v][0]+w>f[u][1])
f[u][1]=f[v][0]+w;
sz[u]+=sz[v];
}
}
}
void dfs2(int u,int fa){
for(edge i:g[u]){
int v=i.v,w=i.w;
if(v==fa)continue;
if(!sz[v])as[v]=as[u]+(w<<1),f[v][0]=f[u][0]+w;
else if(sz[v]==k)as[v]=sm[v];
else{
as[v]=as[u];
if(f[u][0]+w>f[v][0]&&v!=son[u])
f[v][1]=f[v][0],f[v][0]=f[u][0]+w,son[v]=-1;
else if(f[u][1]+w>f[v][0])
f[v][1]=f[u][0],f[v][0]=f[u][1]+w,son[v]=-1;
else if(f[u][0]+w>f[v][1]&&v!=son[u])
f[v][1]=f[u][0]+w;
else if(f[u][1]+w>f[v][1])
f[v][1]=f[u][1]+w;
}
dfs2(v,u);
}
}
signed main(){
freopen("vol.in","r",stdin);
freopen("vol.out","w",stdout);
cin>>n>>k;
for(int i=1;i<n;i++){
int u=read(),v=read(),w=read();
g[u].push_back({v,w});
g[v].push_back({u,w});
}
for(int i=1;i<=k;i++)
++vis[read()];
dfs1(1,0);
as[1]=sm[1];
dfs2(1,0);
for(int i=1;i<=n;i++)
cout<<as[i]-f[i][0]<<endl;
return 0;
}