#include <cstdio>
#include <cmath>
#include <set>
using namespace std;
typedef long long ll;
typedef set<int>::iterator si;
const int N=100010,Bas=19;
int n,m,bas,h[N],tot,dep[N],pre[N][Bas],dfn[N],who[N],tmcnt,state[N],sum;
ll dis[N],ans;
set<int> s;
struct Edge{int v,w,next;}g[N*2];
inline void addEdge(int u,int v,int w){
g[++tot].v=v; g[tot].w=w; g[tot].next=h[u]; h[u]=tot;
}
void predfs(int u,int fa,int Dep,int Dis){
dfn[u]=++tmcnt;
who[tmcnt]=u;
dep[u]=Dep;
dis[u]=Dis;
pre[u][0]=fa;
for(int i=1;i<=bas;i++) pre[u][i]=pre[pre[u][i-1]][i-1];
for(int i=h[u],v;i;i=g[i].next)
if((v=g[i].v)!=fa)
predfs(v,u,Dep+1,Dis+g[i].w);
}
int getlca(int a,int b){
if(dep[a]<dep[b]) swap(a,b);
for(int i=bas;i>=0;i--)
if(dep[pre[a][i]]>=dep[b]) a=pre[a][i];
if(a==b) return a;
for(int i=bas;i>=0;i--)
if(pre[a][i]!=pre[b][i]) a=pre[a][i],b=pre[b][i];
return pre[a][0];
}
int getpre(int u){
si p=s.lower_bound(dfn[u]);
if(p==s.begin()) return -1;
p--;
return who[*p];
}
int getnex(int u){
si p=s.lower_bound(dfn[u]+1);
if(p==s.end()) return -1;
return who[*p];
}
ll getdis(int x,int y){return dis[x]+dis[y]-dis[getlca(x,y)]*2;}
ll count(){
if(sum<=1) return 0;
si a=s.begin();
si b=s.end();
b--;
return getdis(who[*a],who[*b]);
}
int main(){
scanf("%d%d",&n,&m);
bas=(int)log2(n)+1;
for(int i=1,u,v,w;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
addEdge(v,u,w);
}
predfs(1,0,1,0);
int x;
sum=ans=0;
while(m--){
scanf("%d",&x);
if(!state[x]){
sum++;
state[x]=1;
int a=getpre(x),b=getnex(x);
s.insert(dfn[x]);
if(sum>1){
if(a==-1)
ans+=getdis(x,b);
else if(b==-1)
ans+=getdis(a,x);
else{
ans-=getdis(a,b);
ans+=getdis(a,x)+getdis(x,b);
}
}
}
else{
sum--;
state[x]=0;
int a=getpre(x),b=getnex(x);
s.erase(dfn[x]);
if(a!=-1) ans-=getdis(a,x);
if(b!=-1) ans-=getdis(x,b);
if(a!=-1&&b!=-1) ans+=getdis(a,b);
}
printf("%lld\n",ans+count());
}
return 0;
}