#include<bits/stdc++.h>
using namespace std;
#define N 200010
#define int long long
struct node{
int next,to,w;
}ed[N<<1];
int tot,idx,cnt,head[N],son[N],dfn[N],fa[N],top[N],dep[N],dis[N];
int a[N],siz[N],rev[N];
inline void add(int x,int y,int z){
ed[++tot].next=head[x];
ed[tot].to=y;
ed[tot].w=z;
head[x]=tot;
}
inline void dfs1(int u,int f){
siz[u]=1;
fa[u]=f;
dep[u]=dep[f]+1;
for(int i=head[u];i;i=ed[i].next){
int v=ed[i].to;
if(v==f)continue;
dfs1(v,u);
siz[u]+=siz[v];
a[v]=ed[i].w;
dis[v]=dis[u]+ed[i].w;
if(siz[son[u]]<siz[v])son[u]=v;
}
}
inline void dfs2(int x,int vt){
top[x]=vt;
dfn[x]=++idx;
rev[idx]=x;
if(son[x])dfs2(son[x],vt);
for(int i=head[x];i;i=ed[i].next){
int v=ed[i].to;
if(v==fa[x]||v==son[x])continue;
dfs2(v,v);
}
}
struct treee{
int lz,w,sum,l,r;
}tr[N<<2];
inline void build(int rt,int l,int r){
tr[rt].l=l,tr[rt].r=r;
if(l==r){
tr[rt].w=a[rev[l]];
return;
}
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
tr[rt].w=tr[rt<<1].w+tr[rt<<1|1].w;
}
inline void pushdown(int rt){
tr[rt<<1].lz+=tr[rt].lz;
tr[rt<<1|1].lz+=tr[rt].lz;
tr[rt<<1].sum+=tr[rt<<1].w*tr[rt].lz;
tr[rt<<1|1].sum+=tr[rt<<1|1].w*tr[rt].lz;
tr[rt].lz=0;
}
inline void change(int rt,int l,int r,int k){
if(l<=tr[rt].l&&tr[rt].r<=r){
tr[rt].lz+=k;
tr[rt].sum+=k*tr[rt].w;
return;
}
pushdown(rt);
int mid=tr[rt].l+tr[rt].r>>1;
if(l<=mid)change(rt<<1,l,r,k);
if(r>mid)change(rt<<1|1,l,r,k);
tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
}
inline int query(int rt,int l,int r){
if(l<=tr[rt].l&&tr[rt].r<=r){
return tr[rt].sum;
}
pushdown(rt);
int mid=tr[rt].l+tr[rt].r>>1,ret=0;
if(l<=mid) ret+=query(rt<<1,l,r);
if(r>mid)ret+=query(rt<<1|1,l,r);
return ret;
}
inline int lca(int x,int y){
while(top[x]^top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
return x;
}
inline int lca_query(int x,int y){
int ret=0;
while(top[x]^top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ret+=query(1,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ret+=query(1,dfn[x]+1,dfn[y]);
return ret;
}
inline void lca_change(int x,int y,int p){
while(top[x]^top[y]){
if(dep[top[x]]<dep[top[x]])swap(x,y);
change(1,dfn[top[x]],dfn[x],p);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
change(1,dfn[x]+1,dfn[y],p);
}
int ans=0;
inline void qwq(int x){
if(a[x]){
ans-=dis[x];
lca_change(x,1,-1);
--cnt;
}
else{
ans+=dis[x];
lca_change(x,1,1);
++cnt;
}
a[x]^=1;
}
int n,m,ty;
signed main(){
scanf("%lld%lld%lld",&n,&m,&ty);
for(int i=1;i<n;i=-~i){
int x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z);
add(y,x,z);
// cout<<"qwq";
}
dfs1(1,0),dfs2(1,1);
build(1,1,n);
memset(a,0,sizeof(a));
for(int i=1;i<=n;i=-~i){
int x;
scanf("%lld",&x);
if(x)qwq(i);
}//cout<<"qwq";
for(int i=1;i<=m;i=-~i){
int opt,x,y;
scanf("%lld%lld",&opt,&x);
if(opt==1){
qwq(x);
}
else{
scanf("%lld",&y);
int lc=lca(x,y);
printf("%lld\n",ans+cnt*dis[lc]-2*lca_query(1,lc)-lca_query(x,y));
}
}
}