#include <bits/stdc++.h>
#define endl '\n'
#define int long long

using namespace std;

const int N=200000+9,INF=10000000000000000;
vector<vector<int>> na_kojoj_dubini(N,vector<int>(0)),graf(N,vector<int>(0));
vector<int> dubina(N,0);
int dp[N][2][2];
void pravi_daljine(int node,int tr,int pr){
    na_kojoj_dubini[tr].push_back(node);dubina[node]=tr;
    for(auto x:graf[node]){
        if(x==pr) continue;
        pravi_daljine(x,tr+1,node);
    }
}
vector<int> skup_childova(int node){
    vector<int> rez(0);
    for(auto&x:graf[node]){
        if(dubina[x]>dubina[node])
            rez.push_back(x);
    }
    return rez;
}
vector<int> crveni(0),plavi(0);
void dfs(int node,int pret,pair<int,int>trenutni_dp){
    pair<int,int> pomoc;
    pomoc=make_pair(1,1);
    if(trenutni_dp==pomoc){
        if(dubina[node]%2==1) plavi.push_back(node);
        else crveni.push_back(node);
        for(auto x:graf[node]){
            if(x==pret) continue;
            if(min({dp[x][0][1],dp[x][0][0],dp[x][1][1]})==dp[x][0][1]){
                dfs(x,node,{0,1});
            }
            else{
                if(min({dp[x][0][1],dp[x][0][0],dp[x][1][1]})==dp[x][0][0]){
                    dfs(x,node,{0,0});
                }
                else{
                    dfs(x,node,{1,1});
                }
            }
        }
    }
    pomoc=make_pair(0,1);
    if(trenutni_dp==pomoc){
        int dodatak=INF,aktiviraj_ovaj,nula=0;
        for(auto x:graf[node]){
            if(x==pret) continue;
            dodatak=min(dodatak,max(nula,dp[x][1][1]-dp[x][0][1]));
            if(dodatak==max(nula,dp[x][1][1]-dp[x][0][1]))
                aktiviraj_ovaj=x;
        }
        for(auto x:graf[node]){
            if(x==pret) continue;
            if(x==aktiviraj_ovaj){
                dfs(x,node,{1,1});
                continue;
            }
            if(dp[x][1][1]<=dp[x][0][1]){
                dfs(x,node,{1,1});
            }
            else{
                dfs(x,node,{0,1});
            }
        }
    }
    pomoc=make_pair(0,0);
    if(trenutni_dp==pomoc){
        for(auto x:graf[node]){
            if(x==pret) continue;
            dfs(x,node,{0,1});
        }
    }
}



signed main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);

    int n;
    cin >> n;
    vector<int> niz(n);
    for(auto&x:niz)
        cin >> x;
    for(int i=0; i<n-1; i++){
        int a,b;
        cin >> a >> b;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
    vector<int> listovi(0);
    for(int i=1; i<=n; i++){
        if(i!=1&&graf[i].size()==1) listovi.push_back(i);
    }
    pravi_daljine(1,1,-1);
    for(int tren_dubina=n+3; tren_dubina>=0; tren_dubina--){
        for(auto&node:na_kojoj_dubini[tren_dubina]){
            vector<int> childovi=skup_childova(node);
            if(childovi.empty()){
                dp[node][0][1]=INF;
                dp[node][0][0]=0;
                dp[node][1][0]=INF;
                dp[node][1][1]=niz[node-1];
                continue;
            }
            dp[node][1][0]=INF;
            int vrednost=0,dodatak=INF,nula=0;
            for(auto&x:childovi){
                vrednost+=min(dp[x][1][1],dp[x][0][1]);
                dodatak=min(dodatak,max(nula,dp[x][1][1]-dp[x][0][1]));
            }
            dp[node][0][1]=vrednost+dodatak;
            vrednost=0;
            for(auto&x:childovi){
                vrednost+=dp[x][0][1];
            }
            dp[node][0][0]=vrednost;
            vrednost=0;
            for(auto&x:childovi)
                vrednost+=min({dp[x][0][1],dp[x][1][1],dp[x][0][0]});
            dp[node][1][1]=vrednost+niz[node-1];
        }
    }
    cout << min(dp[1][0][1],dp[1][1][1]) << endl;
    if(dp[1][1][1]<=dp[1][0][1])
        dfs(1,-1,{1,1});
    else
        dfs(1,-1,{0,1});
    cout << crveni.size() << endl;
    for(auto&x:crveni)
        cout << x << " ";
    cout << endl;
    cout << plavi.size() << endl;
    for(auto&x:plavi)
        cout << x << " ";
    cout << endl;


    return 0;
}