#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#define pb push_back
const int N=2*1e5+50;
const ll inf=1e18;
vector<int>E[N],E1[N];
ll dp[N][2][2],a[N];
int uzet[N],Color[N],par[N];
void DFSsetup(int u,int parent){
    Color[u]=1-Color[parent];
    for(auto i:E[u]){
        if(i==parent) {par[u]=i;continue;}
        DFSsetup(i,u);
    }
    for(auto i:E[u]){
        if(i==par[u]) continue;
        E1[u].pb(i);
    }
}
void DFS(int u){
    bool bul=false;
    dp[u][1][0]=dp[u][1][1]=a[u],dp[u][0][0]=inf,dp[u][0][1]=0;
    for(auto i:E[u]) DFS(i);
    for(auto i:E[u]){
        dp[u][1][0]+=min(dp[i][0][1],dp[i][1][1]);
        dp[u][1][1]+=min(dp[i][0][1],dp[i][1][1]);
        dp[u][0][1]+=min(dp[i][0][0],dp[i][1][0]);
    }
    dp[u][0][0]=0;
    ll mn=inf;
    for(auto i:E[u]){
        dp[u][0][0]+=min(dp[i][0][0],dp[i][1][0]);
        //dp[u][0]=dp[u][0]-dp[i][0]+dp[i][1]
        if(dp[i][0][0]>=dp[i][1][0]) bul=true;
        mn=min(mn,dp[i][1][0]-dp[i][0][0]);
    }
    if(bul==false) dp[u][0][0]+=mn;
    //for(int i=0;i<=1;i++) for(int j=0;j<=1;j++) printf("%i %i %i: %lld\n",u,i,j,dp[u][i][j]);
}
void DFS1(int u){
    if(uzet[u]==1){
        for(auto i:E[u]) if(dp[i][0][1]>dp[i][1][1]) uzet[i]=1;
    }
    else if(uzet[u]==0 && uzet[par[u]]==1){
        for(auto i:E[u]) if(dp[i][0][0]>dp[i][1][0]) uzet[i]=1;
    }
    else{
        bool bul=false;
        ll mn=inf;int ind=0;
        for(auto i:E[u]){
            if(dp[i][0][0]>=dp[i][1][0]) {uzet[i]=1;bul=true;}
            //if(dp[i][0][0]>=dp[i][1][0]) bul=true;
            if(mn>dp[i][1][0]-dp[i][0][0]){
                mn=dp[i][1][0]-dp[i][0][0];
                ind=i;
            }
        }
        if(!bul) uzet[ind]=1;
    }
    for(auto i:E[u]) DFS1(i);
}
int main()
{
    int n;scanf("%i",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<n;i++){
        int u,v;scanf("%i%i",&u,&v);
        E[u].pb(v),E[v].pb(u);
    }
    DFSsetup(1,0);
    for(int i=1;i<=n;i++) {E[i].clear();while(E1[i].size()){E[i].pb(E1[i].back());E1[i].pop_back();}}
    /*for(int i=1;i<=n;i++){
        printf("%i:  ",i);
        for(auto j:E[i]) printf("%i ",j);
        printf("\n");
    }*/
    DFS(1);
    //ll res=min(dp[1][0][0],min(dp[1][1][0],dp[1][1][1]));
    printf("%lld\n",min(dp[1][0][0],min(dp[1][1][0],dp[1][1][1])));
    //rekonstrukcija
    if(dp[1][0][0]>min(dp[1][1][0],dp[1][1][1])) uzet[0]=1;
    DFS1(1);
    //for(int i=1;i<=n;i++) printf("%i: %i\n",i,uzet[i]);
    vector<int>res[2];
    for(int i=1;i<=n;i++) if(uzet[i]) res[Color[i]].pb(i);
    printf("%i\n",res[0].size());
    for(auto i:res[0]) printf("%i ",i);
    printf("\n%i\n",res[1].size());
    for(auto i:res[1]) printf("%i ",i);
    printf("\n");
    return 0;
}