#include<bits/stdc++.h>
#define ll long long
#define MAXN 200007
using namespace std;
ll a[MAXN];
vector<vector<int>>T(MAXN);
bool visited[MAXN];
ll dp[MAXN][2];
int p[MAXN];
int col[MAXN];
void addEdge(int u, int v)
{
    T[u].push_back(v);
    T[v].push_back(u);
}
void dfs(int node, int c)
{
    visited[node]=true;
    col[node]=c;
    for(auto i:T[node])
    {
        if(!visited[i])
        {
            dfs(i,(1+c)%2);
        }
    }
    return;
}
set<int>z;
void dfsdp(int node)
{
    visited[node]=true;
    if(T[node].size()==1 && node!=1)
    {
        dp[node][1]=a[node];
        dp[node][0]=0;
        return;
    }
    dp[node][1]=a[node];
    dp[node][0]=0;
    bool x=false;
    vector<int>ch;
    for(auto i:T[node])
    {
        if(!visited[i])
        {
            dfsdp(i);
            if(dp[i][1]<=dp[i][0])
            {
                dp[node][1]+=dp[i][1];
            }
            else
            {
                dp[node][1]+=dp[i][0];

            }
            if(T[i].size()==1 && i!=1)
            {
                dp[node][0]+=dp[i][1];
                x=true;
            }
            else if(dp[i][1]<=dp[i][0])
            {
                x=true;
                dp[node][0]+=dp[i][1];
            }
            else
            {
                dp[node][0]+=dp[i][0];
            }
            ch.push_back(i);
        }
    }
    if(x==false)
    {
        ll mini=LLONG_MAX;
        int idx=-1;
        for(auto i:ch)
        {
            if(dp[i][1]-dp[i][0]<=mini)
            {
                idx=i;
                mini=dp[i][1]-dp[i][0];
            }
        }
        dp[node][0]+=mini;
        if(idx!=-1) z.insert(idx);
        if(ch.size()==0) dp[node][0]=LLONG_MAX;
    }
}
void rdfs(int node)
{
    visited[node]=true;
    for(auto i:T[node])
    {
        if(visited[i]==true) continue;
        if(p[node]==1)
        {
            if(dp[i][0]>=dp[i][1]) p[i]=1;
            else p[i]=0;
        }
        else if(p[node]==0)
        {
            if(T[i].size()==1)
            {
                p[i]=1;
            }
            else if(dp[i][1]<=dp[i][0])
            {
                p[i]=1;
            }
            else if(z.count(i)>0)
            {
                p[i]=1;
            }
            else p[i]=0;
        }
        rdfs(i);
    }

}
void solve(int n)
{
    for(int i=1;i<=n;i++)
        visited[i]=false;
    dfs(1,1);
    for(int i=1;i<=n;i++)
        visited[i]=false;
    for(int i=1;i<=n;i++)
    {
        dp[i][0]=LLONG_MAX;
        dp[i][1]=LLONG_MAX;
    }
    dfsdp(1);
    for(int i=1;i<=n;i++)
    {
        visited[i]=0;
        p[i]=0;
    }
    if(dp[1][0]<=dp[1][1])
    {
        cout<<dp[1][0]<<endl;
        p[1]=0;
    }
    else
    {
        cout<<dp[1][1]<<endl;
        p[1]=1;
    }
    rdfs(1);
    vector<int>v1;
    vector<int>v2;
    for(int i=1;i<=n;i++)
    {
        if(p[i]==1)
        {
            if(col[i]==1) v1.push_back(i);
            else v2.push_back(i);
        }
    }
    cout<<v1.size()<<endl;
    for(auto i:v1)
        cout<<i<<" ";
    cout<<endl;
    cout<<v2.size()<<endl;
    for(auto i:v2)
        cout<<i<<" ";
    cout<<endl;
    return;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=0;i<n-1;i++)
    {
        int u,v;
        cin>>u>>v;
        addEdge(u,v);
    }
    solve(n);
}