#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] ;
int tid[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 ;
    long long zbts=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){
                        zbts=0 ;
                        if(g[ds].size()==1){
                            zbts=1e15 ;
                        }
                        for(auto ts: g[ds]){
                            if(vis1[ts]==0){
                            zbts+=k[ts] ;
                            }
                        }
                        if(zbts>k[ds]){
                            zbds+=k[ds] ;
                        }
                        else{
                            zbds+=zbts ;
                            tid[ds]=1;
                        }
                     }
                }
                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){
                        vis1[ds]=1 ;
                        if(t[x]==1){
                            if(tid[ds]==0){
                            c1.push_back(ds) ;
                            q.push(ds) ;
                            t[ds]=1 ;
                            }
                            else{
                                for(auto ts: g[ds]){
                                    if(vis1[ts]==0){
                                        b1.push_back(ts) ;
                                        t[ts]=2 ;
                                        vis1[ts]=1 ;
                                        q.push(ts) ;
                                    }
                                }
                            }
                        }
                        else{
                            if(tid[ds]==0){
                            b1.push_back(ds) ;
                            q.push(ds) ;
                            t[ds]=2 ;
                            }
                            else{
                                for(auto ts: g[ds]){
                                    if(vis1[ts]==0){
                                        c1.push_back(ts) ;
                                        t[ts]=1 ;
                                        vis1[ts]=1 ;
                                        q.push(ts) ;
                                    }
                                }
                            }
                        }
                     }
                    }
                    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 ;
    long long zbts=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){
                        zbts=0 ;
                        if(g[ds].size()==1){
                            zbts=1e15 ;
                        }
                        for(auto ts: g[ds]){
                            if(vis1[ts]==0){
                            zbts+=k[ts] ;
                            }
                        }
                        if(zbts>k[ds]){
                            zbds+=k[ds] ;
                        }
                        else{
                            zbds+=zbts ;
                            tid[ds]=1;
                        }
                     }
                }
                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){
                        vis1[ds]=1 ;
                        if(t[x]==1){
                            if(tid[ds]==0){
                            c2.push_back(ds) ;
                            t[ds]=1 ;
                            q.push(ds) ;
                            }
                            else{
                                for(auto ts: g[ds]){
                                    if(vis1[ts]==0){
                                        b2.push_back(ts) ;
                                        t[ts]=2 ;
                                        vis1[ts]=1 ;
                                        q.push(ts) ;
                                    }
                                }
                            }
                        }
                        else{
                            if(tid[ds]==0){
                            b2.push_back(ds) ;
                            t[ds]=2 ;
                            q.push(ds) ;
                            }
                            else{
                                for(auto ts: g[ds]){
                                    if(vis1[ts]==0){
                                        c2.push_back(ts) ;
                                        t[ts]=1 ;
                                        vis1[ts]=1;
                                        q.push(ts) ;
                                    }
                                }
                            }
                        }
                     }
                    }
                    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) ;
    }
    int l ;
    for(int i=1 ; i<=n ;i++){
        if(g[i].size()==1){
            l=i ;
            break ;
        }
    }
    long long z1=popuni1(l) ;
    for(int i=1 ; i<=n ; i++){
        vis1[i]=0 ;
        t[i]=0 ;
        tid[i]=0 ;
    }
    long long z2=popuni2(g[l][0]) ;
    if(z1<z2){
    cout << z1 << endl ;
    int cs=c1.size() ;
    cout << cs << endl ;
    for(int i=0 ; i<cs; i++){
        cout << c1[i] << " " ;
    }
    cout << endl ;
    int bs=b1.size() ;
    cout << bs << endl ;
    for(int i=0 ; i<bs; i++){
        cout << b1[i] << " " ;
    }
    }
    else{
        cout << z2 << endl ;
        int cs=c2.size() ;
        cout << cs << endl ;
        for(int i=0 ; i<cs; i++){
            cout << c2[i] << " " ;
        }
        cout << endl ;
        int bs=b2.size() ;
        cout << bs << endl ;
        for(int i=0 ; i<bs; i++){
            cout << b2[i] << " " ;
        }
    }
    return 0;
}