#include<iostream>
#include<cstring> 
using namespace std;

int main(){
	
	int n;//地窖个数 
	int f[201];//表示从第i个地窖开始最多挖出的地雷数:
	int w[201];//表示每个地窖的藏雷数
	int c[201];//记录路径
	
	bool a[201][201];//表示从第i个地窖到第j个地窖是否有通路
	
	//初始化数组
	memset(f,0,sizeof(f));
	memset(w,0,sizeof(w));
	memset(c,0,sizeof(c));
	memset(a,false,sizeof(a));
	
	cin>>n;//输入地窖的个数 
	
	//输入每个地窖的藏雷数 
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
	
	
	int x,y; 
	//输入从第i个地窖到第j个地窖是否有通路
	do{
		cin>>x>>y;
		if((x!=0)&&(y!=0)) a[x][y]=true;
		
	}while((x!=0)||(y!=0));
	
	int t;//临时变量 存放f[i]的地雷数 
	int k;//存放最优路径 
	
	//从第n个坑开始挖,下面没有坑,也就是第N个坑的雷数 
	f[n]=w[n];
	//从第n-1个坑开始挖 
	for(int i=n-1;i>=1;i--){
		t=0;
		k=0;
		//有通路的条件是i<j<=n; a[i][j]=true 
		for(int j=i+1;j<=n;j++){
			//有通路,并且下一个坑的地雷数比较多 
			if((a[i][j]) && (f[j]>t)){
				t=f[j];
				k=j;
			}
		}
		//从第i个坑开始挖的最大值 
		f[i]=t+w[i];
		c[i]=k;	
	}
	
	//计算最多的地雷数
	k=1;//假设第一个坑开始挖出地雷数最大多
	int max=0;//挖出最多地雷数 
	//从第二个坑开始和第一个坑比较 
	for(int j=2;j<=n;j++){
		if(f[j]>f[k]){
			k=j;//将最大挖雷的坑的序号保存到k 
		}
	} 
	
	max=f[k];
	
	cout<<k;//输出起始坑的序号 
	//输出路径
	k=c[k];
    while(k!=0){
    	cout<<"-"<<k;
    	k=c[k];
	} 
	
	cout<<endl;
	cout<<max<<endl;
 
}
/**************************************************************
	Problem: 1276
	User: admin
	Language: C++
	Result: Accepted
	Time:16 ms
	Memory:2072 kb
****************************************************************/