#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
****************************************************************/