#include <bits/stdc++.h>
/*
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <cstring>
#include <algorithm>
#include <cstdio>
*/
using namespace std;
#define Riep(n) for(int i=1;i<=n;i++)
#define Riop(n) for(int i=0;i<n;i++)
#define Rjep(n) for(int j=1;j<=n;j++)
#define Rjop(n) for(int j=0;j<n;j++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
typedef long long LL;
const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e5+4;
int n,m,head[N],l[2*N],r[2*N],cnt,num;
LL dis[N],b[N],va[N];
struct Edge
{
int to,next;
}edge[2*N];
void add_edge(int s,int e)
{
edge[cnt].next=head[s];
edge[cnt].to=e;
head[s]=cnt++;
}
void dfs(int x,int fa)
{
num++;
b[num]=dis[x];
l[x]=num;
for(int i=head[x];i!=-1;i=edge[i].next)
{
int y=edge[i].to;
if(y!=fa)
{
dis[y]=dis[x]+va[y];
dfs(y,x);
}
}
r[x]=num;
}
struct Tree
{
int l,r;
LL ans,lazy;
}tr[4*N];
void pushup(int o)
{
tr[o].ans=max(tr[2*o].ans,tr[2*o+1].ans);
}
void pushdown(int o)
{
if(tr[o].lazy)
{
tr[2*o].ans+=tr[o].lazy;
tr[2*o+1].ans+=tr[o].lazy;
tr[2*o].lazy+=tr[o].lazy;
tr[2*o+1].lazy+=tr[o].lazy;
tr[o].lazy=0;
}
}
void build(int o,int L,int R)
{
tr[o].l=L;
tr[o].r=R;
tr[o].lazy=0;
if(L>=R)
{
tr[o].ans=b[L];
return ;
}
int mid=(L+R)>>1;
build(2*o,L,mid);
build(2*o+1,mid+1,R);
pushup(o);
}
void update(int o,int L,int R,LL val)
{
if(L<=tr[o].l&&R>=tr[o].r)
{
tr[o].ans=tr[o].ans+val;
tr[o].lazy=tr[o].lazy+val;
return ;
}
int mid=(tr[o].l+tr[o].r)>>1;
pushdown(o);
if(R<=mid)update(2*o,L,R,val);
else if(L>mid)update(2*o+1,L,R,val);
else
{
update(2*o,L,mid,val);
update(2*o+1,mid+1,R,val);
}
pushup(o);
}
LL query(int o,int L,int R)
{
if(L<=tr[o].l&&tr[o].r<=R)return tr[o].ans;
int mid=(tr[o].l+tr[o].r)>>1;
pushdown(o);
if(R<=mid)return query(o*2,L,R);
else if(L>mid)return query(o*2+1,L,R);
else return max(query(2*o,L,mid),query(2*o+1,mid+1,R));
}
int main()
{
int t;
scanf("%d",&t);
int Case=1;
while(t--)
{
printf("Case #%d:\n",Case++);
cnt=0;
num=0;
mst(head,-1);
scanf("%d%d",&n,&m);
int u,v;
Riep(n-1)
{
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
Riop(n)scanf("%I64d",&va[i]);
dis[0]=va[0];
dfs(0,-1);
build(1,1,num);
int flag,x,y;
Riep(m)
{
scanf("%d",&flag);
if(flag)
{
scanf("%d",&x);
printf("%I64d\n",query(1,l[x],r[x]));
}
else
{
scanf("%d%d",&x,&y);
update(1,l[x],r[x],(LL)y-va[x]);
va[x]=(LL)y;
}
}
}
return 0;
}