#include <bits/stdc++.h>
using namespace std;
vector<int> g[200010] ;
int vis1[200010] ;
long long k[200010] ;
vector<int> c1 ;
vector<int> b1 ;
vector<int> c2 ;
vector<int> b2 ;
int t[200010] ;
long long popuni1(int node){
    vis1[node]=1 ;
    long long zb=k[node] ;
    queue<int> q ;
    q.push(node) ;
    long long zbs=0 ;
    long long zbds=0 ;
    c1.push_back(node) ;
    t[node]=1 ;
    while(!q.empty()){
        int x=q.front() ;
        q.pop() ;
        for(auto s : g[x]){
            zbs=0 ;
            zbds=0 ;
            if(vis1[s]==0){
                vis1[s]=1 ;
                zbs+=k[s] ;
                if(g[s].size()==1){
                    zbs=0 ;
                }
                for(auto ds: g[s]){
                     if(vis1[ds]==0){
                        zbds+=k[ds] ;
                     }
                }
                if(zbs<zbds){
                    q.push(s) ;
                    zb+=zbs ;
                    if(t[x]==1){
                        b1.push_back(s) ;
                        t[s]=2 ;
                    }
                    else{
                        c1.push_back(s) ;
                        t[s]=1 ;
                    }

                }
                else{
                    for(auto ds: g[s]){
                     if(vis1[ds]==0){
                        q.push(ds) ;
                        vis1[ds]=1 ;
                        if(t[x]==1){
                            c1.push_back(ds) ;
                            t[ds]=1 ;
                        }
                        else{
                            b1.push_back(ds) ;
                            t[ds]=2 ;
                        }
                     }
                    }
                    zb+=zbds ;
                }
            }
        }
    }
    return zb ;
}


long long popuni2(int node){
    vis1[node]=1 ;
    long long zb=k[node] ;
    queue<int> q ;
    q.push(node) ;
    long long zbs=0 ;
    long long zbds=0 ;
    c2.push_back(node) ;
    t[node]=1 ;
    while(!q.empty()){
        int x=q.front() ;
        q.pop() ;
        for(auto s : g[x]){
            zbs=0 ;
            zbds=0 ;
            if(vis1[s]==0){
                vis1[s]=1 ;
                zbs+=k[s] ;
                if(g[s].size()==1){
                    zbs=0 ;
                }
                for(auto ds: g[s]){
                     if(vis1[ds]==0){
                        zbds+=k[ds] ;
                     }
                }
                if(zbs<zbds){
                    q.push(s) ;
                    zb+=zbs ;
                    if(t[x]==1){
                        b2.push_back(s) ;
                        t[s]=2 ;
                    }
                    else{
                        c2.push_back(s) ;
                        t[s]=1 ;
                    }

                }
                else{
                    for(auto ds: g[s]){
                     if(vis1[ds]==0){
                        q.push(ds) ;
                        vis1[ds]=1 ;
                        if(t[x]==1){
                            c2.push_back(ds) ;
                            t[ds]=1 ;
                        }
                        else{
                            b2.push_back(ds) ;
                            t[ds]=2 ;
                        }
                     }
                    }
                    zb+=zbds ;
                }
            }
        }
    }
    return zb ;
}

int main()
{
    ios::sync_with_stdio(false) ;
    cin.tie(0) ;
    cout.tie(0) ;
    int n  ;
    cin >> n ;
    for(int i=1; i<=n ; i++){
        cin >> k[i] ;
    }
    int u,v  ;
    for(int i=1 ; i<n ; i++){
        cin >> u >> v ;
        g[v].push_back(u) ;
        g[u].push_back(v) ;
    }
    long long z1=popuni1(1) ;
    for(int i=1 ; i<=n ; i++){
        vis1[i]=0 ;
        t[i]=0 ;
    }
    long long z2=popuni2(g[1][0]) ;
    if(z1<z2){
    cout << z1 << endl ;
    cout << c1.size() << endl ;
    for(int i=0 ; i<c1.size(); i++){
        cout << c1[i] << " " ;
    }
    cout << endl ;
    cout << b1.size() << endl ;
    for(int i=0 ; i<b1.size(); i++){
        cout << b1[i] << " " ;
    }
    }
    else{
        cout << z2 << endl ;
        cout << c2.size() << endl ;
        for(int i=0 ; i<c2.size(); i++){
            cout << c2[i] << " " ;
        }
        cout << endl ;
        cout << b2.size() << endl ;
        for(int i=0 ; i<b2.size(); i++){
            cout << b2[i] << " " ;
        }
    }
    return 0;
}