// author: hjy
// Problem:
#include<bits/stdc++.h>
//#pragma GCC optimize(2)
using namespace std;

#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define rep(i,n) for(register int i=0; i<(int)(n); ++i)
#define per(i,n) for(register int i=(int)(n)-1; i>=0; --i)
#define rep1(i,n) for(register int i=1; i<=(int)(n); ++i)
#define all(x) (x).begin(),(x).end()
#define debug(x) cerr<<#x<<"="<<x<<'\n'

inline int read() {
	int x=0,ng=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-') ng=1; ch=getchar(); }
	while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); }
	return ng?-x:x;
}

const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int seed=20040305;

int n,k;
vector<int> vec[100100];
pii t[100100];
int visit[100100];
int root;
int res[100100];

void dfs(int a,int p,int l,int r)
{
	t[a]=mp(l,r);
	for(int i=0;i<vec[a].size();i++)
	{
		int u=vec[a][i];
		if(u==p) continue;
		if(visit[u])
		{
			if(t[u].fi%2!=1-(l%2)) 
			{
				puts("No");
				exit(0);
			}
			if((t[u].fi<l-1)||(t[u].se>r+1)) 
			{
				puts("No");
				exit(0);
			}
			dfs(u,a,t[u].fi,t[u].se);
		}
		else dfs(u,a,l-1,r+1);
	}
}

void dfs2(int a,int p)
{
	for(int i=0;i<vec[a].size();i++)
	{
		int u=vec[a][i];
		if(u==p) continue;
		dfs2(u,a);
		t[a].fi=max(t[a].fi,t[u].fi-1);
		t[a].se=min(t[u].se,t[u].se+1);
		if(t[a].fi>t[a].se)
		{
			puts("No");
			exit(0);
		}
	}
}

void getans(int a,int p,int v)
{
	res[a]=v;
	rep(i,vec[a].size())
	{
		int u=vec[a][i];
		if(u==p) continue;
		if((t[u].fi<=v-1)&&(v-1<=t[u].se)) getans(u,a,v-1);
		else getans(u,a,v+1);
	}
}

int main()
{
	scanf("%d",&n);
	rep(i,n-1)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		vec[a].pb(b);
		vec[b].pb(a);
	}
	scanf("%d",&k);
	rep(i,k)
	{
		int v,p;
		scanf("%d%d",&v,&p);
		t[v]=mp(p,p);
		root=v;
		visit[v]=1;
	}
	dfs(root,0,t[root].fi,t[root].se);
	dfs2(root,0);
	getans(root,0,t[root].fi);
	puts("Yes");
	rep1(i,n) printf("%d\n",res[i]);
}
