#define _CRT_SECURE_NO_WARNINGS
/* To Be or Not To Be !!
Allah_Almost3aan
Make it happens :) */
#include<bits/stdc++.h>
#include<unordered_map>
//#include<unorderd_set>
using namespace std;
using ll = long long;
using ld = long double;
const ll OO = 1e16;
#define ed '\n'
#define F first
//#define S second
#define sz(a)a.size()
#define vi vector<int>
#define pii pair<int,int>
#define all(c)c.begin(),c.end()
#define RT(v)return cout<<v,0
#define rall(s)s.rbegin(),s.rend()
#define stpr(n)fixed<<setprecision(n)
int di[8] = { 0, 0, 1, -1, -1, 1, -1, 1 };
int dj[8] = { 1, -1, 0, 0, 1, 1, -1, -1 };
#define show(x)cout<<"> "<<(#x)<<" = "<<x<<ed
#define reset(mem,val)memset(mem,val,sizeof mem)
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
string ys = "YES", no = "NO";
const long double dgr = acos(-1) / 180, dg = 180 / acos(-1);
const int mod = 1e9 + 7, N = 1e5 + 5;


int main()
{
	fast;
	int t;
	cin >> t;
	while (t--)
	{
		priority_queue<pair<ll, int>>q;
		int n;  cin >> n;
		vi v(n + 1);
		for (int i = 1; i <=n; ++i)cin >> v[i];
		int deg[N] = { 0 };
		for (int i = 0; i < n - 1; ++i){
			int x, y;
			cin >> x >> y;
			deg[x]++, deg[y]++;
		}
		ll ans = 0;
		for (int i = 1; i <= n; ++i){
			ans += v[i];
			if (deg[i] > 1)
				q.push({v[i], deg[i] - 1 });
		}
		for (int i = 0; i < n - 1; ++i){
			cout << ans << " ";
			if (sz(q))
			{
				pair<ll, int>p = q.top();
				q.pop();
				ans += p.first, p.second--;
				if (p.second)
					q.push({ p.first, p.second });
			}
		}
		cout <<ed;
	}
	return 0;
}
