/*
建立一颗虚树,然后求虚树上的2倍边权和。
由于每次只增加或减少一个点,所以可以用set维护一个dfn的单调递增序列,
每次增添一个点时,将它与相邻节点的距离加上(头和尾也算相邻),再将前后的点间距减去。
删除同理。
*/
#include<iostream>
#include<cstdio>
#include<set>
#define N 100010
#define inf 1000000000
#define lon long long
using namespace std;
int head[N],dep[N],fa[N][20],g[N],dfn[N],id[N],n,m,cnt,tot;
lon dis[N],ans;
struct node{int v,w,pre;}e[N*2];
void add(int u,int v,int w){
e[++cnt].v=v;e[cnt].w=w;e[cnt].pre=head[u];head[u]=cnt;
}
void dfs(int x){
dfn[x]=++tot;id[tot]=x;
for(int i=head[x];i;i=e[i].pre)
if(e[i].v!=fa[x][0]){
dep[e[i].v]=dep[x]+1;
dis[e[i].v]=dis[x]+e[i].w;
fa[e[i].v][0]=x;
dfs(e[i].v);
}
}
int LCA(int a,int b){
if(dep[a]<dep[b]) swap(a,b);
int t=dep[a]-dep[b];
for(int i=19;~i;i--)
if(t&(1<<i)) a=fa[a][i];
if(a==b) return a;
for(int i=19;~i;i--)
if(fa[a][i]!=fa[b][i])
a=fa[a][i],b=fa[b][i];
return fa[a][0];
}
lon calc(int a,int b){
int anc=LCA(a,b);
return dis[a]+dis[b]-2*dis[anc];
}
set<int> st;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
int u,v,w;scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
dfs(1);
for(int j=1;j<=19;j++)
for(int i=1;i<=n;i++)
fa[i][j]=fa[fa[i][j-1]][j-1];
st.insert(-inf);st.insert(inf);
for(int i=1;i<=m;i++){
int x;scanf("%d",&x);g[x]^=1;
long long t;
if(g[x]) st.insert(dfn[x]),t=1;else st.erase(dfn[x]),t=-1;
int l=*--st.lower_bound(dfn[x]),r=*st.upper_bound(dfn[x]);
if(l!=-inf) ans+=t*calc(id[l],x);
if(r!=inf) ans+=t*calc(id[r],x);
if(l!=-inf&&r!=inf) ans-=t*calc(id[l],id[r]);
lon tmp=0;
if(st.size()>3)
tmp=calc(id[*st.upper_bound(-inf)],id[*--st.lower_bound(inf)]);
printf("%lld\n",ans+tmp);
}
return 0;
}