#include<bits/stdc++.h>
using namespace std;
long long N,a[200009];
long long const inf=1e9+1;
vector<long long>G[200009],T[200009];
long long dp[200009][6];
int posecen[200009];
void rekG(int x,int dubina){
  posecen[x]=dubina;
  for(int i=0; i<G[x].size(); i++){
    int y=G[x][i];
    if(posecen[y]>0)continue;
    T[x].push_back(y);
    rekG(y,dubina+1);
  }
}
long long min3(long long a,long long b,long long c){
  if(a>b)swap(a,b);
  if(a>c)swap(a,c);
  return a;
}
void rekT(int x){
  dp[x][0]=a[x];
  for(int i=0; i<T[x].size(); i++){
    int y=T[x][i];
    rekT(y);
    if(T[y].size()!=0)dp[x][0]+=min3(dp[y][0],dp[y][1],dp[y][2]);
    dp[x][1]+=dp[y][0];
    dp[x][2]+=min(dp[y][0],dp[y][1]);
  }
  if(T[x].size()==0)dp[x][1]=dp[x][2]=inf;
}
bool nasol[200009];
void rek3(int x,int d){
  if(d==0 or (dp[x][0]<=dp[x][1] and dp[x][0]<=dp[x][2])){
    nasol[x]=true;
    d=3;
  }
  for(int i=0; i<T[x].size(); i++){
    int y=T[x][i];
    if(T[y].size()==0){
      if(!nasol[x])rek3(y,0);
    }
    else rek3(y,d-1);
  }
}
int main(){
  //freopen("A11.txt","r",stdin);
  ios_base::sync_with_stdio(false);
  for(int i=1; i<=N; i++)posecen[i]=0;
  for(int i=1; i<=N; i++)G[i].clear();
  for(int i=1; i<=N; i++)T[i].clear();
  for(int i=1; i<=N; i++)nasol[i]=false;
  cin>>N;
  for(int i=1; i<=N; i++)cin>>a[i];
  for(int i=1; i<N; i++){
    int u,v;
    cin>>u>>v;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  dp[N][0]=a[N];
  dp[N-1][0]=a[N-1];
  dp[N-1][1]=a[N];
  dp[N-1][2]=a[N];
  //cout<<dp[N][0]<<" "<<dp[N][1]<<" "<<dp[N][2]<<endl;
  for(int i=N-2; i>=1; i--){
    dp[i][0]=min3(dp[i+1][0],dp[i+1][1],dp[i+1][2]);
    dp[i][1]=dp[i+1][0];
    dp[i][2]=min(dp[i+1][1],dp[i+1][0]);
    dp[i][0]+=a[i];
  }
//  for(int i=1; i<=N; i++)cout<<i<<" : "<<dp[i][0]<<" "<<dp[i][1]<<" "<<dp[i][2]<<endl;
//  cout<<endl;
  long long sol=0;
  int d=0;
  int poc=1;
  if(dp[poc][0]<=dp[poc][1]){
    sol=dp[poc][0];
    d=0;
  }
  else{
    sol=dp[poc][1];
    d=1;
  }
  for(int i=1; i<=N; i++)posecen[i]=i;
  for(int i=1; i<=N; i++){
    if(d==0 or (dp[i][0]<=dp[i][1] and dp[i][0]<=dp[i][2])){
      nasol[i]=true;
      d=2;
      continue;
    }
    if(i==N-1 and !nasol[i])d=1;
    d--;
  }
  vector<int>plavi,crveni;
  for(int i=1; i<=N; i++){
    if(!nasol[i])continue;
    if(posecen[i]%2==1)plavi.push_back(i);
    if(posecen[i]%2==0)crveni.push_back(i);
  }
  cout<<sol<<endl;
  cout<<plavi.size()<<"\n";
  for(int i=0; i<plavi.size(); i++)cout<<plavi[i]<<" ";
  if(plavi.size())cout<<"\n";
  cout<<crveni.size()<<"\n";
  for(int i=0; i<crveni.size(); i++)cout<<crveni[i]<<" ";
  if(crveni.size())cout<<"\n";
  return 0;
}