#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define X 100001
int i,a[X],b[X],t,x,y,N,M,nL,sol,w[X],*G[X],v[X],fol[X],niv[X],l[X],aint[4*X],lTata[X],lNiv[X],lDim[X],lPoz[X];
vector<int> P[X];
void df(int nod)
{fol[nod]=1;
int frunza=1,nrfii=-1,j,lN=-1,k;
for(j=0;j<w[nod];j++)
if(!fol[G[nod][j]])
{frunza=0,niv[G[nod][j]]=niv[nod]+1,df(G[nod][j]);
if(lN==-1)
lN=G[nod][j];}
if(frunza)
{l[nod]=++nL,lDim[nL]=1,P[nL].push_back(nod);
return;}
for(j=0;j<w[nod];j++)
{if(G[nod][j]!=lN&&niv[G[nod][j]]>=niv[nod])
lTata[l[G[nod][j]]]=nod,lNiv[l[G[nod][j]]]=niv[nod];
if(G[nod][j]==1&&w[1]>nrfii)
nrfii=w[1],k=1;
else
if(w[G[nod][j]]>nrfii+1)
nrfii=w[G[nod][j]]-1,k=G[nod][j];}
l[nod]=l[k],lDim[l[nod]]++,P[l[nod]].push_back(nod);}
void build(int nod,int left,int right,int decalaj,int lant)
{if(left==right)
{aint[nod+decalaj]=v[P[lant][left-1]];
return;}
int med=(left+right)/2;
build(nod*2,left,med,decalaj,lant);
build(nod*2+1,med+1,right,decalaj,lant);
aint[nod+decalaj]=max(aint[nod*2+decalaj],aint[nod*2+1+decalaj]);}
void update(int nod,int left,int right,int poz,int val,int decalaj)
{if(left==right)
{aint[nod+decalaj]=val;
return;}
int med=(left+right)/2;
if(poz<=med)
update(nod*2,left,med,poz,val,decalaj);
else
update(nod*2+1,med+1,right,poz,val,decalaj);
aint[nod+decalaj]=max(aint[nod*2+decalaj],aint[nod*2+1+decalaj]);}
int query(int nod,int left,int right,int qleft,int qright,int decalaj)
{if(qleft<=left&&right<=qright)
return aint[nod+decalaj];
int med=(left+right)/2,rez=0;
if(qleft<=med)
rez=max(rez,query(nod*2,left,med,qleft,qright,decalaj));
if(med<qright)
rez=max(rez,query(nod*2+1,med+1,right,qleft,qright,decalaj));
return rez;}
int main()
{freopen("heavypath.in","r",stdin),freopen("heavypath.out","w",stdout);
scanf("%d%d",&N,&M);
for(i=1;i<=N;++i)
scanf("%d",&v[i]);
for(i=1;i<N;i++)
scanf("%d%d",&a[i],&b[i]),w[a[i]]++,w[b[i]]++;
for(i=1;i<=N;w[i++]=0)
G[i]=new int[w[i]];
for(i=1;i<N;i++)
G[a[i]][w[a[i]]++]=b[i],G[b[i]][w[b[i]]++]=a[i];
niv[1]=1,df(1),reverse(P[1].begin(),P[1].end()),build(1,1,lDim[1],lPoz[1],1);
for(i=2;i<=nL;++i)
lPoz[i]=lPoz[i-1]+lDim[i-1]*4,reverse(P[i].begin(),P[i].end()),build(1,1,lDim[i],lPoz[i],i);
while(M--)
{scanf("%d%d%d",&t,&x,&y);
if(!t)
update(1,1,lDim[l[x]],niv[x]-lNiv[l[x]],y,lPoz[l[x]]);
else
{while(1)
{if(l[x]==l[y])
{if(niv[x]>niv[y])
swap(x,y);
sol=max(sol,query(1,1,lDim[l[x]],niv[x]-lNiv[l[x]],niv[y]-lNiv[l[x]],lPoz[l[x]]));
break;}
if(lNiv[l[x]]<lNiv[l[y]])
swap(x,y);
sol=max(sol,query(1,1,lDim[l[x]],1,niv[x]-lNiv[l[x]],lPoz[l[x]])),x=lTata[l[x]];}
printf("%d\n",sol),sol=0;}}
return 0;}