#include <bits/stdc++.h>
#define mp make_pair
using namespace std;

long long n, a[300000], p[300000], d[300000], dp[300000][3], k1[300000], k0[300000], u, v;
pair<long long, long long> dn[300000];
vector<long long> adj[300000], ch[300000], res0, res1;

void dfs(long long node) {
    for(long long i=0; i<adj[node].size(); i++) {
        if(adj[node][i]!=p[node]) {
            ch[node].push_back(adj[node][i]);
            p[adj[node][i]]=node;
            d[adj[node][i]]=d[node]+1;
            dfs(adj[node][i]);
        }
    }
}

void dpr(long long node) {
    dp[node][0]=dp[node][1]=dp[node][2]=0;
    for(long long i=0; i<ch[node].size(); i++) dp[node][2]+=dp[ch[node][i]][0];
    dp[node][2]+=a[node];
    for(long long i=0; i<ch[node].size(); i++) dp[node][0]+=dp[ch[node][i]][1];
    long long m=10000000000000000ll, g=-1;
    for(long long i=0; i<ch[node].size(); i++) if(m>dp[ch[node][i]][2]-dp[ch[node][i]][1]) {
        m=dp[ch[node][i]][2]-dp[ch[node][i]][1];
        g=ch[node][i];
    }
    dp[node][1]=dp[node][0]+m;
    k1[node]=g;
    if(dp[node][1]>dp[node][2]) {
        dp[node][1]=dp[node][2];
        k1[node]=-1;
    }
    k0[node]=0;
    if(dp[node][0]>dp[node][2]) {
        dp[node][0]=dp[node][2];
        k0[node]=-1;
    }
    //cout<<node<<' '<<dp[node][0]<<' '<<dp[node][1]<<' '<<dp[node][2]<<'\n';
}

void cr(long long node, long long t) {
    if(t==2||(t==1&&k1[node]==-1)||(t==0&&k0[node]==-1)) {
        if(d[node]%2) res1.push_back(node);
        else res0.push_back(node);
        for(long long i=0; i<ch[node].size(); i++) cr(ch[node][i], 0);
    }
    else if(t==0) {
        for(long long i=0; i<ch[node].size(); i++) cr(ch[node][i], 1);
    }
    else {
        for(long long i=0; i<ch[node].size(); i++) {
            if(k1[node]=ch[node][i]) cr(ch[node][i], 2);
            else cr(ch[node][i], 1);
        }
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n;
    for(long long i=1; i<=n; i++) cin>>a[i];
    for(long long i=1; i<n; i++) {
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    p[1]=1;
    d[1]=0;
    dfs(1);
    for(long long i=1; i<=n; i++) dn[i]=mp(d[i], i);
    sort(dn+1, dn+n+1);
    reverse(dn+1, dn+n+1);
    for(long long i=1; i<=n; i++) dpr(dn[i].second);
    cout<<dp[1][1]<<'\n';
    cr(1, 1);
    cout<<res0.size()<<'\n';
    for(long long i=0; i<res0.size(); i++) cout<<res0[i]<<' ';
    cout<<'\n';
    cout<<res1.size()<<'\n';
    for(long long i=0; i<res1.size(); i++) cout<<res1[i]<<' ';
    return 0;
}