#include<cstdio>
#include <list>

#define N 100000

using namespace std;

long long int miasta[N + 10];

struct krawedz {
	long long int wierzcholek;
	long long int koszt;
};

list<krawedz> sasiedzi[N + 10];

long long int max_zysk;
long long int max_wierzcholek;

long long int czy_odwiedzony[N + 10];

long long int tryb;

int odwiedz_graf(long long int wierzcholek, long long int odwiedzony, long long int myto) {
	czy_odwiedzony[wierzcholek] = odwiedzony;
	
	if (tryb == 1) {
		max_wierzcholek = wierzcholek;
		max_zysk = miasta[wierzcholek] - myto;
	
	} else if (tryb > 1) {
		long long int zysk_w = miasta[wierzcholek] - myto;
		if (zysk_w > max_zysk) {
			max_zysk = zysk_w;
			max_wierzcholek = wierzcholek;
		
		} else if (zysk_w == max_zysk) {
			if (wierzcholek < max_wierzcholek) {	
				max_wierzcholek = wierzcholek;
			}
		}
	}
	
	for (list<krawedz>::iterator it = sasiedzi[wierzcholek].begin(); it != sasiedzi[wierzcholek].end(); ++it) {
		if (czy_odwiedzony[(*it).wierzcholek] != odwiedzony) {
			tryb++;
			odwiedz_graf((*it).wierzcholek, odwiedzony, myto + (*it).koszt);
		}
	}
	
	return max_wierzcholek;
}

int main() {
	long long int n, q, a, b, miasto;
	long long int koszt, zysk;
	krawedz k1, k2;
	long long int biezacy_wierzcholek = 1;
	
	scanf("%lld %lld", &n, &q);
	
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &miasta[i]);
	}
	
	for (int i = 0; i < n - 1; i++) {
		scanf("%lld %lld %lld", &a, &b, &koszt);
		
		k1 = {b, koszt};
		sasiedzi[a].push_back(k1);
		
		k2 = {a, koszt};
		sasiedzi[b].push_back(k2);
	}
	
	for (int i = 0; i < q; i++) {
		scanf("%lld", &tryb);
		
		if (tryb == 1) {
			scanf("%lld %lld", &miasto, &zysk);
			miasta[miasto] = zysk;
		
		} else if (tryb == 2) {
			scanf("%lld %lld %lld", &a, &b, &koszt);
			
			// zaktualizować koszt a -> b
			for (list<krawedz>::iterator it = sasiedzi[a].begin(); it != sasiedzi[a].end(); ++it) {
				if ((*it).wierzcholek == b) {
					(*it).koszt = koszt;
					break;
				}
			}
			
			// zaktualizować koszt b -> a
			for (list<krawedz>::iterator it = sasiedzi[b].begin(); it != sasiedzi[b].end(); ++it) {
				if ((*it).wierzcholek == a) {
					(*it).koszt = koszt;
				}
			}
		}
		
		tryb = 0L;
		biezacy_wierzcholek = odwiedz_graf(biezacy_wierzcholek, i + 1, 0);
		
		printf("%lld ", biezacy_wierzcholek);
	}
	
	return 0;
}
