//#include "pch.h"
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#include <vector>
#include <set>
#include <map>
#include <iostream>
#include <utility>
#include <queue>
#include <algorithm>
#include <functional>
#include <string>
#include <bitset>

#define ll long long
#define fri(n) for(i=0;i<(n);i++)
#define frj(n) for(j=0;j<(n);i++)
#define min(p,q) ((p)<(q)?(p):(q))
#define max(p,q) ((p)>(q)?(p):(q))
#define INF 1000000000000000000//10^18
#define INFINT 2000000001//2*10^9+1
#define MOD 1000000007
#define MODANOTHER 998244353
#define PI acos(-1)

#define vi vector<int>
#define vvi vector<vector<int>>
#define vvvi vector<vector<vector<int>>>
#define vd vector<double>
#define vvd vector<vector<double>>
#define vvvd vector<vector<vector<double>>>


//#define int long long

using namespace std;

signed compare_ll(const void *a, const void *b)
{
	ll *A = (ll *)a;
	ll *B = (ll *)b;
	if (*A < *B) return 1;
	if (*A > *B) return -1;
	return 0;
}

int init(vector<int>& map, int n){
	int i;

	for(i=0;i<=n;i++){
		map[i]=0;
	}
	return 0;
}

struct pret_t{
	int min;
	int max;
	int bl;
};

pret_t search(int x,vvi& graph, vi& vec, vi& come,vector<pret_t>& pretvec){
	int i;
	int flag;
	pret_t pret;
	pret_t ptemp;
	
	come[x]=1;

	//xに数字が書いてある場合とない場合で分ける

	if(vec[x]!=-1){
		pret.max=vec[x];
		pret.min=vec[x];
		pret.bl=1;
	}else{
		pret.max=0;
		pret.min=0;
		pret.bl=0;
	}

	for(i=0;i<graph[x].size();i++){
		if(come[graph[x][i]]!=0) continue;

		ptemp=search(graph[x][i],graph,vec,come,pretvec);
		ptemp.max++;
		ptemp.min--;

		if(ptemp.bl==-1){
			pret=ptemp;
			break;
		}else if(pret.bl==0){
			if(ptemp.bl==0) continue;
			pret=ptemp;
		}else if(ptemp.bl==1){
			if((pret.max-ptemp.max)%2!=0) pret.bl=-1;
			pret.max=min(pret.max,ptemp.max);
			pret.min=max(pret.min,ptemp.min);
			if(pret.max<pret.min) pret.bl=-1;
		}
	}

	pretvec[x]=pret;
	return pret;
}

int inverse(int x,int num,vvi& graph,vi& vec, vi& come,vector<pret_t>& pretvec){
	int i;

	come[x]=1;
	if(pretvec[x].min<=num+1&&num+1<=pretvec[x].max){
		vec[x]=num+1;
	}else{
		vec[x]=num-1;
	}

	for(i=0;i<graph[x].size();i++){
		if(come[graph[x][i]]!=0) continue;
		inverse(graph[x][i],vec[x],graph,vec,come,pretvec);
	}

	return 0;
}

signed main(void)
{
	//変数の宣言
	int n,m;
	int h,w;
	int x,y;
	static int v[100010];
	static int p[100010];
	vector<vector<int>> graph;

	//よく使う変数
	int i,j,k,l;
	int flag=0;
	int ans=0;
	int count=0;
	int temp=0;
	int temp1=0;
	int temp2=0;
	int temp3=0;
	vector<int> vec;
	vector<int> vtemp;
	int max=0;
	int min=INFINT;
	int len=0;
	int sum=0;
	int ok=0;
	int ng=0;
	char dummy;
	static char stemp[100010];
	
	//データの読み込み


	scanf("%d",&n);
//	scanf_s("%d",&n);


//	scanf("%s",&s);
//	scanf_s("%s",&s,20);


/*	//scanf("%c",&dummy);
	scanf_s("%c",&dummy);
	for(i=0;i<n;i++){
//		scanf("%c",&s[i]);
		scanf_s("%c",&s[i]);
	}*/

	for(i=0;i<=n;i++){
		graph.push_back(vtemp);
	}


	for(i=0;i<n-1;i++){
		scanf("%d %d",&temp,&temp2);
//		scanf_s("%d %d",&temp,&temp2);
		graph[temp].push_back(temp2);
		graph[temp2].push_back(temp);
	}

	scanf("%d",&m);
//	scanf_s("%d",&m);

	for(i=0;i<m;i++){
		scanf("%d %d",&v[i],&p[i]);
//		scanf_s("%d %d",&v[i],&p[i]);
	}

	//	printf("nは%dです\n", n);
	//	printf("データの読み込み終了\n");
	//実際の処理

//	clock_t start=clock();
	for(i=0;i<=n;i++){
		vec.push_back(-1);
	}
	for(i=0;i<m;i++){
		vec[v[i]]=p[i];
	}

	vector<int> come(n+1,0);
	pret_t ptemp;
	vector<pret_t> pretvec(n+1,ptemp);

	
	ptemp=search(1,graph,vec,come,pretvec);
	
	if(ptemp.bl==-1){
		printf("No");
		return 0;
	}

	printf("Yes\n");

	for(i=0;i<=n;i++){
		come[i]=0;
		vec[i]=0;
	}

	inverse(1,pretvec[1].max-1,graph,vec,come,pretvec);

	for(i=1;i<=n;i++){
		printf("%d\n",vec[i]);
	}

//	clock_t end=clock();

	//	printf("計算部分終了\n");

	//出力
	
	//printf("%d",(d[i-1][j-1]+1)/2);

//	printf("time=%lf",(double)(end-start)/CLOCKS_PER_SEC);
	//	printf("結果の出力終了\n");

	return 0;
}



Measured memory_bytes: 22640