#include <bits/stdc++.h>
#define ll long long
#define MAXN 200010
#define llinf 10000000000000000
using namespace std;
ll a[MAXN],dp[MAXN][3][3],sum[MAXN][3][3];
vector<ll> vec[3],G[MAXN];
void DFS(ll i,ll p)
{
    sum[i][1][1]=llinf;
    for (ll next : G[i])
    {
        if (next!=p)
        {
            DFS(next,i);
            if (sum[i][0][0]<llinf)
            {
                if (dp[next][1][0]>=llinf)
                    sum[i][0][0]=llinf;
                else
                    sum[i][0][0]+=dp[next][1][0];
            }
            if (sum[i][0][1]<llinf)
            {
                if (dp[next][0][0]>=llinf)
                    sum[i][0][1]=llinf;
                else
                    sum[i][0][1]+=dp[next][0][0];
            }
            if (sum[i][1][0]<llinf)
            {
                if (min({dp[next][1][0],dp[next][0][0],dp[next][0][1]})>=llinf)
                    sum[i][1][0]=llinf;
                else
                    sum[i][1][0]+=min({dp[next][1][0],dp[next][0][0],dp[next][0][1]});
            }
        }
    }
    if (G[i].size()==1 && i!=1)
    {
        dp[i][0][1]=0;
        dp[i][1][0]=a[i];
        dp[i][0][0]=llinf;
        return;
    }
    for (ll k=0;k<2;k++)
    {
        for (ll j=0;j<2;j++)
        {
            if (sum[i][k][j]<llinf)
                dp[i][k][j]=sum[i][k][j]+(k!=0)*a[i];
            else
                dp[i][k][j]=llinf;
        }
    }
}
void Solve(ll i,ll p,ll curx,ll cury,ll d)
{
    if (curx)
        vec[d&1].push_back(i);
    for (ll next : G[i])
    {
        if (next!=p)
        {
            if (curx==0 && cury==0)
                Solve(next,i,1,0,d+1);
            else if (curx==0 && cury==1)
                Solve(next,i,0,0,d+1);
            else
            {
                if (min({dp[next][1][0],dp[next][0][0],dp[next][0][1]})==dp[next][1][0])
                    Solve(next,i,1,0,d+1);
                else if (min({dp[next][1][0],dp[next][0][0],dp[next][0][1]})==dp[next][0][0])
                    Solve(next,i,0,0,d+1);
                else
                    Solve(next,i,0,1,d+1);
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll n,u,v;
    cin >> n;
    for (ll i=1;i<=n;i++)
    {
        cin >> a[i];
        for (ll x=0;x<3;x++)
        {
            for (ll y=0;y<3;y++)
                dp[i][x][y]=llinf;
        }
    }
    for (ll i=1;i<n;i++)
    {
        cin >> u >> v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    DFS(1,0);
    ll minn=LLONG_MAX,x,y;
    for (ll i=0;i<2;i++)
    {
        if (dp[1][i][0]<minn)
        {
            minn=dp[1][i][0];
            x=i;
            y=0;
        }
    }
    Solve(1,0,x,y,0);
    cout << minn << "\n";
    cout << vec[1].size() << "\n";
    for (ll i : vec[1])
        cout << i << " ";
    cout << "\n";
    cout << vec[0].size() << "\n";
    for (ll i : vec[0])
        cout << i << " ";
    cout << "\n";
    return 0;
}