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

using VS = vector<string>;    using LL = long long;
using VI = vector<int>;       using VVI = vector<VI>;
using PII = pair<int, int>;   using PLL = pair<LL, LL>;
using VL = vector<LL>;        using VVL = vector<VL>;

#define ALL(a)  begin((a)),end((a))
#define RALL(a) (a).rbegin(), (a).rend()
#define SZ(a) int((a).size())
#define SORT(c) sort(ALL((c)))
#define RSORT(c) sort(RALL((c)))
#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))
#define FOR(i, s, e) for (int(i) = (s); (i) < (e); (i)++)
#define FORR(i, s, e) for (int(i) = (s); (i) > (e); (i)--)
//#pragma GCC optimize ("-O3") 
#ifdef YANG33
#include "mydebug.hpp"
#else
#define DD(x) 
#endif
const int INF = 1e9;                          const LL LINF = 1e16;
const LL MOD = 1000000007;                    const double PI = acos(-1.0);
int DX[8] = { 0, 0, 1, -1, 1, 1, -1, -1 };    int DY[8] = { 1, -1, 0, 0, 1, -1, 1, -1 };

/* -----  __MAKE_TIME__  Problem: __PROBLEM__ / Link: __CONTEST_URL__  ----- */
/* ------問題------



-----問題ここまで----- */
/* -----解説等-----



----解説ここまで---- */
const int Max = 1e5 + 5;

PLL adje[Max]; // 2
LL fnl[Max]; // 3
const PLL ERROR = PLL(LINF, -LINF);
int NO = 0;
// adgeのparityは満たされるものだけをつくるとする
// O(N)
void f1(int v, int p, bool pari, const VVI& G) {
	if (adje[v].second - adje[v].first == 0) {
		// 値が決まっている場合
	}
	else { // そうではない
		// 親のcondをみて、自身の区間を決定する
		// parityいらなくないか
		adje[v].first = -INF - 1, adje[v].second = INF + 1;
		/*cond[v].first = cond[p].first - 1;
		cond[v].second = cond[p].second + 1;*/
	}

	for (int nx : G[v]) {
		if (nx == p)continue;
		f1(nx, v, !pari, G);
		if (adje[nx].first < -INF / 2)continue;
		if (adje[v].first < -INF / 2) {
			adje[v].first = adje[nx].first - 1;
			adje[v].second = adje[nx].second + 1;
		}
		else {
			if (abs(adje[nx].first) % 2 == abs(adje[v].first) % 2) {
				NO = 1;
			}
			adje[v].first = max(adje[v].first, adje[nx].first - 1);
			adje[v].second = min(adje[v].second, adje[nx].second+1);
		}

	}
	if (adje[v].first > adje[v].second)NO = 1;
	//if (rg.first > rg.second) { // NO
	//	adje[v] = ERROR;
	//}
	//else {
	//	// rg∧condを満たす区間があるならばその最大範囲を持つ
	//	rg.first--, rg.second++;
	//	adje[v].first = max(rg.first, cond[v].first);
	//	adje[v].second = min(rg.second, cond[v].second);

	//	if (adje[v].first > adje[v].second) {
	//		adje[v] = ERROR;
	//	}
	//}

}

void f2(int v, int p, const VVI&G) {
	// adje,pからfnlが決定される
	if (p != -1) {
		int val = fnl[p];
		if (adje[v].first <= val + 1 && val + 1 <= adje[v].second) {
			fnl[v] = val + 1;
		}
		else if (adje[v].first <= val - 1 && val - 1 <= adje[v].second) {
			fnl[v] = val - 1;
		}
		else {
			//NO = 1;
			assert(0);
		}
	}
	for (int nx : G[v]) {
		if (nx == p)continue;
		f2(nx, v, G);
	}
}


int main() {
	cin.tie(0);
	ios_base::sync_with_stdio(false);

	LL N; cin >> N;
	VVI G(N);
	FOR(i, 0, N - 1) {
		int a, b; cin >> a >> b;
		a--, b--;
		G[a].push_back(b);
		G[b].push_back(a);
	}
	FOR(i, 0, N) {
		adje[i] = PLL(-INF, INF);
	}
	int K; cin >> K;
	int root = 0;
	FOR(i, 0, K) {
		int v, p; cin >> v >> p;
		v--;
		adje[v] = PLL(p, p);
		root = v;
	}
	DD(de(root));
	f1(root, -1, adje[root].first & 1, G);
	FOR(i, 0, N) {
		DD(de(i + 1, adje[i]));
	}
	if (!NO) {
		fnl[root] = adje[root].first;
		f2(root, -1, G);
		cout << "Yes" << endl;
		FOR(i, 0, N) {
			cout << fnl[i] << endl;
		}
	}
	else {
		cout << "No" << endl;
	}

	return 0;
}

//



Measured memory_bytes: 16512