#include <bits/stdc++.h>
using namespace std;

const int N=100010;
struct edge{int s,t,n;}e[2*N];
int n,k,h[N],a[N],col[N],l[N],r[N],fail;

void dfs1(int x,int f)
{
	if ((~a[x])&&((a[x]&1)^col[x]))  fail=1;
	for (int i=h[x],y; y=e[i].t,i; i=e[i].n)
		if (y!=f)  col[y]=col[x]^1,dfs1(y,x);		
}

void dfs2(int x,int f)
{
	if (~a[x])  l[x]=r[x]=a[x];  else  l[x]=-1<<30,r[x]=1<<30;
	for (int i=h[x],y; y=e[i].t,i; i=e[i].n)
		if (y!=f)  dfs2(y,x),l[x]=max(l[x],l[y]-1),r[x]=min(r[x],r[y]+1);
	l[x]+=((l[x]&1)^col[x]),r[x]-=((r[x]&1)^col[x]);
	if (l[x]>r[x])  fail=1;
}

void dfs3(int x,int f)
{
	for (int i=h[x],y; y=e[i].t,i; i=e[i].n)
		if (y!=f)  a[y]=a[x]+((l[y]<=a[x]+1)&&(a[x]+1<=r[y])?1:-1),dfs3(y,x);
}

void work()
{
	scanf("%d",&n),memset(a,-1,sizeof(a));
	for (int i=1,u,v,tot=0; i<n; i++)
		{
			scanf("%d %d",&u,&v);
			e[++tot]=(edge){u,v,h[u]},h[u]=tot;
			e[++tot]=(edge){v,u,h[v]},h[v]=tot;
		}
	scanf("%d",&k);
	for (int i=1,v,p; i<=k; i++)  scanf("%d %d",&v,&p),a[v]=p;
	for (int i=1; i<=n; i++)  if (~a[i])  {col[i]=a[i]&1,dfs1(i,0);  break;}
	if (fail)  puts("No"),exit(0);
	dfs2(1,0);
	if (fail)  puts("No"),exit(0);
	a[1]=l[1],dfs3(1,0);
	puts("Yes");
	for (int i=1; i<=n; i++)  printf("%d\n",a[i]);
}

int main()
{
	work();
	return 0;
}
