← Home
#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;
}