#include <bits/stdc++.h>
#define ll long long
using namespace std;
int N, u, v, R, B;
stack <int> RED;
stack <int> BLUE;
ll X;
ll A[200096];
ll DP[2][200096];
bool D[200096];
vector <int> VG[200096];
inline void Chain()
{
    DP[1][N + 1] = 1e18;
    for(int i = N; i >= 1; i--)
    {
        DP[0][i] = min(DP[1][i + 1], DP[1][i + 2]);
        DP[1][i] = A[i] + min(DP[0][i + 1], DP[1][i + 1]);
    }
//    for(int i = 1; i <= N; i++) printf("%lld ", DP[0][i]);
//    printf("\n");
//    for(int i = 1; i <= N; i++) printf("%lld ", DP[1][i]);
//    printf("\n");
    X = min(DP[0][1], DP[1][1]);
    if(DP[0][1] == X) D[1] = 0;
    else D[1] = 1;
    bool colour = 0;
    if(D[1])
    {
        R++;
        RED.push(1);
        colour ^= 1;
    }
    for(int i = 2; i <= N; i++)
    {
        if(D[i - 1])
        {
            if(DP[0][i] < DP[1][i]) D[i] = 0;
            else D[i] = 1;
        }
        else
        {
            if((DP[1][i] < DP[1][i + 1]) || !D[i - 2]) D[i] = 1;
            else D[i] = 0;
        }
//        printf("%d dobio %d\n", i, D[i]);
        if(D[i])
        {
            if(colour)
            {
                B++;
                BLUE.push(i);
            }
            else
            {
                R++;
                RED.push(i);
            }
            colour ^= 1;
        }
    }
}
void DFS(int node)
{
    DP[1][node] = A[node];
    for(int i = 0; i < VG[node].size(); i++)
    {

    }
}
void RECONSTRUCT(int node)
{

}
int main()
{
    scanf("%d", &N);
    for(int i = 1; i <= N; i++)
    {
        scanf("%lld", &A[i]);
    }
    for(int i = 1; i < N; i++)
    {
        scanf("%d %d", &u, &v);
        VG[u].push_back(v);
        VG[v].push_back(u);
    }

    Chain();

    printf("%lld\n", X);
    printf("%d\n", R);
    while(R--)
    {
        printf("%d ", RED.top());
        RED.pop();
    }
    printf("\n");
    printf("%d\n", B);
    while(B--)
    {
        printf("%d ", BLUE.top());
        BLUE.pop();
    }
    printf("\n");


    return 0;
}