#include<bits/stdc++.h>
using namespace std;
int n;
const int maxn=(int)2e5+10;
typedef long long ll;
ll w[maxn];
vector<int>graf[maxn];
bool init[maxn];
ll dp[maxn][2]; //dp[k] je za podstablo gde je k koren
bool len[maxn][2]; //len[k] je 1 ako je obojen ili ima obojenog suseda (u svom podstablu)
bool visited[maxn];
vector<int>aux[maxn];
void root(int u)
{
    visited[u]=true;
    for (auto v: aux[u])
    {
        if (visited[v]) continue;
        graf[u].push_back(v);
        root(v);
    }
    return;
}
void nadji(int k)
{
    if (graf[k].size()==0)
    {
        dp[k][0]=0; len[k][0]=false;
        dp[k][1]=w[k]; len[k][1]=true;
        init[k]=true;
        return;
    }
    dp[k][1]=w[k];
    init[k]=true;
    for (int i=0; i<(int)graf[k].size(); i++) //za 1
    {
        if (!init[graf[k][i]])
        {
            nadji(graf[k][i]);
            init[graf[k][i]]=true;
        }

        dp[k][1]+=min(dp[graf[k][i]][0],dp[graf[k][i]][1]);
        len[k][1]=true;
    }
    bool b=true;
    ll s=0;
    for (int i=0; i<(int)graf[k].size(); i++) //za 0
    {
        if (!init[graf[k][i]])
        {
            nadji(graf[k][i]);
            init[graf[k][i]]=true;
        }
        if (!len[graf[k][i]][0] && graf[graf[k][i]].size()!=0)
        {
            dp[k][0]+=dp[graf[k][i]][1];
            b=false;
        }
        if (!len[graf[k][i]][0] && graf[graf[k][i]].size()==0)
        {
            dp[k][0]+=w[graf[k][i]];
            s+=w[graf[k][i]];
        }
        if (len[graf[k][i]][0])
        {
            dp[k][0]+=min(dp[graf[k][i]][0],dp[graf[k][i]][1]);
            if (dp[graf[k][i]][1]<=dp[graf[k][i]][0]) len[k][0]=true;
            b=false;
        }
    }
    if (b)
        dp[k][0]=s;
}//imamo ovo sve sad valjda;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n;
    for (int i=1; i<=n; i++)
        cin >> w[i];
    int a,b;
    for (int i=0; i<n-1; i++)
    {
        cin >> a >> b;
        aux[a].push_back(b);
        aux[b].push_back(a);
    }
    root(1);
    for (int i=1; i<=n; i++)
    {
        cout << i << " ";
        for (int j=0; j<(int)graf[i].size(); j++)
            cout << graf[i][j] << " ";
        cout << "\n";
    }
    cout << "\n";
    nadji(1); //zasto je bitno odakle buildujem?
    cout << min(dp[1][0],dp[1][1]) << "\n";
    ll sol=min(dp[1][0],dp[1][1]);
    return 0;
}