#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,flag,tot,hh,dep[500001],a[500001],e[500001],nt[500001],hd[500001],v[500001],l[500001],r[500001];
void build(int x,int y){
	tot++;
	e[tot]=y;
	nt[tot]=hd[x];hd[x]=tot;
}
void dfs(int x,int fa){
	int i;
	dep[x]=dep[fa]+1;
	for(i=hd[x];i;i=nt[i]){
		if(e[i]==fa)continue;
		dfs(e[i],x);
	}
}
void get(int x,int fa){
	int i;
	if(v[x])l[x]=r[x]=a[x];
	 else l[x]=-1e9,r[x]=1e9;
	for(i=hd[x];i;i=nt[i]){
		if(e[i]==fa)continue;
		get(e[i],x);
		l[x]=max(l[x],l[e[i]]-1);
		r[x]=min(r[x],r[e[i]]+1);
	}
	if(l[x]>r[x])flag=1;
}
void ha(int x,int fa){
	int i;
	if(!v[x]){
		if(a[fa]+1>=l[x]&&a[fa]+1<=r[x])a[x]=a[fa]+1;
		 else a[x]=a[fa]-1;
	}
	for(i=hd[x];i;i=nt[i]){
		if(e[i]==fa)continue;
		ha(e[i],x);
	}
}
int main(){
	int i,x,y,m;
	scanf("%d",&n);
	for(i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		build(x,y);build(y,x);
	}
	dfs(1,0);
	scanf("%d",&m);
	for(i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		a[x]=y;v[x]=1;
		if(i==1)hh=(y&1)^(dep[x]&1);
		 else if(((y&1)^(dep[x]&1))!=hh)return puts("No"),0;
	}
	get(1,0);
	if(flag)return puts("No"),0;
	if(!v[1])v[1]=1,a[1]=l[1];
	ha(1,0);
	puts("Yes");
	for(i=1;i<=n;i++)printf("%d\n",a[i]);
}
/*
考虑不合法的情况就是距离为偶数的点权奇偶不同或为奇数的奇偶相同。
判掉之后每个点的取值范围可从其儿子节点递推过来 
*/