#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define fr(i,a,b) for(int i=(a);i<=(b);++i)
#define rp(i,a,b) for(int i=(a);i>=(b);--i)
const int N=3e5+5;
int n,a[N],cnt,p[N],s[N],dfn[N],ff[N],v[N],num,sz[N],sz2[N],sum;vector<int>e[N];ll ans;
inline void dfs(int x) {for(int y:e[x]) ff[y]=x,s[y]=s[x]+1,dfs(y);}
inline bool cmp(int x,int y) {return a[x]<a[y];}
inline void dfs2(int x) {
sz[x]=v[x];sz2[x]=1;
sort(e[x].begin(),e[x].end(),cmp);
for(int y:e[x]) dfs2(y),sz[x]+=sz[y],sz2[x]+=sz2[y];
return ;
}
inline void dfs3(int x) {
if(sz[x]!=sz2[x]&&sz[x]!=sum) {
printf("NO\n");
exit(0);
}
for(int y:e[x]) dfs3(y);
if(v[x]) {
--sum;
if(a[x]<num) {
printf("NO\n");
exit(0);
}
num=a[x];
}
return ;
}
inline void dfs4(int x) {
if(!v[x]) {
if(a[x]<num) {
printf("NO\n");
exit(0);
}
num=a[x];
}
for(int y:e[x]) dfs4(y);
return ;
}
inline void dfs5(int x) {
dfn[x]=++num;
for(int y:e[x]) dfs5(y);
return ;
}
int main() {
scanf("%d",&n);
fr(i,1,n) scanf("%d",a+i),p[a[i]]=i;
fr(i,1,n-1) {int x,y;scanf("%d%d",&x,&y);e[x].push_back(y);}
int mk=1;dfs(1);
fr(i,1,n) {
int fl=0;
for(int y:e[p[i]]) if(a[y]>i) fl=1;
ans+=s[p[i]];
if(fl==1) {mk=p[i];break;}
v[p[i]]=1;
}
while(mk!=1) {
int x=ff[mk];
for(int y:e[x]) if(y!=mk) {
if(a[y]>a[mk]&&a[y]<a[x]) {
printf("NO\n");
return 0;
}
}
swap(a[x],a[mk]);
mk=x;
}
dfs2(1);sum=sz[1];
dfs3(1);dfs4(1);
printf("YES\n%lld\n",ans);
num=0;dfs5(1);
fr(i,1,n) printf("%d ",dfn[i]);printf("\n");
return 0;
}