#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define S second
#define F first
#define int long long

const int N = 2e5+3;
int dp[N][3];
int a[N], par[N];
vector<int> g[N];
vector<int> f, s;
bool da[N];

void dfs(int v, int p, int h){
    if(da[v]){
        if(h&1)f.pb(v);
        else s.pb(v);
    }
    for(int i=0; i<g[v].size(); i++){
        int to = g[v][i];
        if(to!=p){
            dfs(to, v, h+1);
        }
    }
}

void dfs(int v, int p){
    par[v]=p;
    dp[v][0]=a[v];
    dp[v][1]=0;
    dp[v][2]=0;
    if(g[v].size()==1 && p==g[v][0])dp[v][1]=2e9;
    for(int i=0; i < g[v].size(); i++){
        int to = g[v][i];
        if(to!=p){
            dfs(to, v);
            dp[v][0]+=min(dp[to][2], min(dp[to][1], dp[to][0]));
            dp[v][1]+=dp[to][0];
            dp[v][2]+=min(dp[to][1], dp[to][0]);
        }
    }
}

void solve(){
   int n;
   cin >> n;
   for(int i=1; i<=n; i++)cin >> a[i];
   for(int i=0; i<n-1; i++){
        int u, v;
        cin >> u >> v;
        g[u].pb(v);
        g[v].pb(u);
    }
    int mnans=1e18;
    int mnansind=0;
    int tt;
    if(n<=1000)tt=n;
    else tt=1;
    for(int i=1; i<=n; i++){
        dfs(i, i);
        mnans=min(mnans, min(dp[i][0], dp[i][1]));
        if(mnans==min(dp[i][0], dp[i][1]))mnansind=i;
    }
    dfs(mnansind, mnansind);
    int ans = min(dp[mnansind][0], dp[mnansind][1]);
    cout << mnansind << '\n';
    for(int i=1; i<=n; i++){
        cout << dp[i][0] << " " << dp[i][1] << " " << dp[i][2] << '\n';
    }
    cout << ans << '\n';
    queue< pair<int, int> > gans;
    if(dp[mnansind][0]<dp[mnansind][1])gans.push({mnansind, 0});
    else gans.push({mnansind, 1});
    while(gans.size()){
        pair<int, int> p = gans.front();
        gans.pop();
        int v = p.F;
        if(p.S==0){
            da[v]=1;
            for(int i=0; i<g[v].size(); i++){
                int to = g[v][i];
                if(to!=par[v]){
                    int mn = min(dp[to][0], min(dp[to][1], dp[to][2]));
                    if(dp[to][0]==mn)gans.push({to, 0});
                    else if(dp[to][1]==mn)gans.push({to, 1});
                    else gans.push({to, 2});
                }
            }
        }
        else if(p.S==1){
            for(int i=0; i< g[v].size(); i++){
                int to = g[v][i];
                if(to!=par[v])gans.push({to, 0});
            }
        }
        else{
            for(int i=0; i<g[v].size(); i++){
                int to = g[v][i];
                if(to!=par[v]){
                    if(dp[to][0]<dp[to][1])gans.push({to, 0});
                    else gans.push({to, 1});
                }
            }
        }
    }
    dfs(1, 1, 1);
    int sum=0;
    for(int i=1; i<=n; i++){
        if(da[i])sum+=a[i];
    }
    assert(sum==ans);
    cout << f.size() << '\n';
    for(int i=0; i<f.size(); i++)cout << f[i] << " ";
    cout << '\n';
    cout << s.size() << '\n';
    for(int i=0; i<s.size(); i++)cout << s[i] << " ";
    cout << '\n';
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    solve();
}