#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int n;
vector<int> boja;
vector<vector<int>> adj;
vector<int> a;

void setup(){
    boja.resize(n,0);
    queue<int> q;
    boja[0]=1;
    q.push(0);
    while(!q.empty()){
        int tr=q.front(); q.pop();
        for(int komsija : adj[tr]){
            if(boja[komsija]==0){
                if(boja[tr]==1)boja[komsija]=2;
                else boja[komsija]=1;

                q.push(komsija);
            }
        }
    }
}


bool check(vector<bool>& b){
    for(int i=0; i<n; i++){
        if(!b[i]){
            for(int komsija : adj[i]){
                if(b[komsija])goto dun;
            }
            return false;
            dun:;
        }
    }
    return true;
}

pair<int,vector<bool>> krlj(vector<bool>& tmp, int i){
    if(i == n){
        if(!check(tmp)) return {INT_MAX,{}};
        int sol=0;
        for(int i=0; i<n; i++)if(tmp[i])sol+=a[i];
        return {sol,tmp};
    }
    tmp[i]=false;
    auto sol1=krlj(tmp,i+1);
    tmp[i]=true;
    auto sol2=krlj(tmp,i+1);
    if(sol1.first<sol2.first)return sol1;
    else return sol2;
}

int main(){
    cin >> n;
    a.resize(n);
    adj.resize(n);
    for(int i=0; i<n; i++)cin >> a[i];
    for(int i=0; i<n-1; i++){
        int u,v; cin >> u >> v;
        u--; v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    setup();
    vector<bool> tmp(n,0);
    auto sol=krlj(tmp,0);
    cout << sol.first << '\n';
    int x=0,y=0;
    for(int i=0; i<n; i++){
        if(sol.second[i]){
            if(boja[i]==1)x++;
            else y++;
        }
    }

    cout << x << '\n';
    for(int i=0; i<n; i++){
        if(sol.second[i] && boja[i]==1)cout << i+1 << ' ';
    }
    cout << '\n';
    cout << y << '\n';
    for(int i=0; i<n; i++){
        if(sol.second[i] && boja[i]==2)cout << i+1 << ' ';
    }
    return 0;
}