#include <bits/stdc++.h>
#define LL long long
#define endl '\n'
#define Aurora main
#define pb push_back
using namespace std;
int N,T,num[100001],r=0,mine[100001],mm=-1,mc,c;
int tu[201][201],f[10005],ind[300],so[300],dp[1000001],tran[300];
bool flag=0;
queue<int> q;
void topsort(){
for(int i=1;i<=N;i++) if(!ind[i]) q.push(i);
int temp;
while(!q.empty()){
temp=q.front();
so[++r]=temp;
q.pop();
for(int i=1;i<=N;i++){
if(tu[temp][i]){
ind[i]--;
if(!ind[i]) q.push(i);
}
}
}
}
int Aurora(){
int a,b;
scanf("%d",&N);
for(int i=1;i<=N;i++) scanf("%d",&mine[i]);
while(1){
scanf("%d %d",&a,&b);
if(!a&&!b) break;
tu[a][b]=1;
ind[b]++;
}
topsort();
for(int i=1;i<=N;i++) if(!ind[i]) dp[i]=mine[i];
for(int i=1;i<=r;i++){
for(int j=1;j<=N;j++){
if(tu[so[i]][j]){
if(dp[j]<dp[i]+mine[j]){
dp[j]=dp[i]+mine[j];
tran[j]=i;
}
}
}
}
for(int i=1;i<=N;i++) {
if(dp[i]>mm){
mm=dp[i];
mc=i;
}
}
stack<int> s;
while(mc){
s.push(mc);
T++;
mc=tran[mc];
}
for(int i=1;i<=T;i++){
cout<<s.top();
s.pop();
if(i!=T) cout<<'-';
}
cout<<endl;
cout<<mm<<endl;
return 0;
}