#include<bits/stdc++.h>

#define pb push_back
#define fi first
#define se second
#define mp make_pair

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef long double ld;

template <typename T> chkmin(T& a,T b){return a>b?a=b,1:0;}
template <typename T> chkmax(T& a,T b){return a<b?a=b,1:0;}

ll readint(){
    ll x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

int n,tot;
int a[200005],v[400005],nxt[400005],h[200005],d[200005];
ll dp[200005][2][2],tmp[2][2]; // (he, ch)
vector<array<int,4>> prv[200005][2][2];
bool take[200005];
vector<int> res[2];

void addedge(int x,int y){
    v[++tot]=y; nxt[tot]=h[x]; h[x]=tot;
    v[++tot]=x; nxt[tot]=h[y]; h[y]=tot;
}

void solve(int x,int f){
    int deg=0;
    for(int p=h[x];p;p=nxt[p]){
        if(v[p]==f) continue;
        solve(v[p],x);
        deg++;
    }
    if(deg==0){
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                dp[x][i][j]=(ll)1e18;
            }
        }
        dp[x][0][0]=0;
        dp[x][1][0]=a[x];
        return;
    }
    dp[x][0][0]=0;
    dp[x][1][0]=a[x];
    dp[x][0][1]=(ll)1e18;
    dp[x][1][1]=(ll)1e18;
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            prv[x][i][j].resize(deg);
        }
    }
    deg=0;
    for(int p=h[x];p;p=nxt[p]){
        if(v[p]==f) continue;
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                tmp[i][j]=dp[x][i][j];
                dp[x][i][j]=(ll)1e18;
            }
        }
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                for(int r=0;r<2;r++){
                    for(int q=0;q<2;q++){
                        if(r==0&&q==0&&i==0) continue;
                        if(chkmin(dp[x][i][j|r],tmp[i][j]+dp[v[p]][r][q])) prv[x][i][j|r][deg]={i,j,r,q};
                    }
                }
            }
        }
        deg++;
    }
}

void rec(int x,int f,int a,int b){
    if(a==1) take[x]=true;
    vector<int> ch;
    for(int p=h[x];p;p=nxt[p]){
        if(v[p]==f) continue;
        ch.pb(v[p]);
    }
    int deg=(int)ch.size();
    for(int i=deg-1;i>=0;i--){
        rec(ch[i],x,prv[x][a][b][i][2],prv[x][a][b][i][3]);
        int p=prv[x][a][b][i][0];
        int q=prv[x][a][b][i][1];
        a=p; b=q;
    }
}

void bfs(int x){
    for(int i=1;i<=n;i++) d[i]=-1;
    d[x]=0;
    queue<int> que;
    que.push(x);
    while(!que.empty()){
        int a=que.front();
        que.pop();
        for(int p=h[a];p;p=nxt[p]){
            if(d[v[p]]==-1){
                d[v[p]]=(d[a]^1);
                que.push(v[p]);
            }
        }
    }
}

int main(){
    n=readint();
    for(int i=1;i<=n;i++) a[i]=readint();
    for(int i=1;i<n;i++) addedge(readint(),readint());
    solve(1,1);
    int a=1,b=1;
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            if(i==0&&j==0) continue;
            if(dp[1][i][j]<dp[1][a][b]){
                a=i;
                b=j;
            }
        }
    }
    rec(1,1,a,b);
    int rt=-1;
    for(int i=1;i<=n;i++) if(take[i]) rt=i;
    assert(rt!=-1);
    bfs(rt);
    for(int i=1;i<=n;i++) if(take[i]) res[d[i]].pb(i);
    printf("%lld\n",min({dp[1][1][1],dp[1][0][1],dp[1][1][0]}));
    for(int i=0;i<2;i++){
        printf("%d\n",res[i].size());
        for(int j:res[i]) printf("%d ",j);
        printf("\n");
    }
    return 0;
}