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


#define li          long long int
#define rep(i,to)   for(li i=0;i<((li)(to));i++)
#define repp(i,start,to)    for(li i=(li)(start);i<((li)(to));i++)
#define pb          push_back
#define sz(v)       ((li)(v).size())
#define bgn(v)      ((v).begin())
#define eend(v)     ((v).end())
#define allof(v)    (v).begin(), (v).end()
#define dodp(v,n)       memset(v,(li)n,sizeof(v))
#define bit(n)      (1ll<<(li)(n))
#define mp(a,b)     make_pair(a,b)
#define rin rep(i,n)
#define EPS 1e-12
#define ETOL 1e-8
#define MOD 1000000007
typedef pair<li, li> PI;

#define INF bit(60)

#define DBGP 1


#define idp if(DBGP)
#define F first
#define S second
#define p2(a,b)     idp cout<<a<<"\t"<<b<<endl
#define p3(a,b,c)       idp cout<<a<<"\t"<<b<<"\t"<<c<<endl
#define p4(a,b,c,d)     idp cout<<a<<"\t"<<b<<"\t"<<c<<"\t"<<d<<endl
#define p5(a,b,c,d,e)       idp cout<<a<<"\t"<<b<<"\t"<<c<<"\t"<<d<<"\t"<<e<<endl
#define p6(a,b,c,d,e,f)     idp cout<<a<<"\t"<<b<<"\t"<<c<<"\t"<<d<<"\t"<<e<<"\t"<<f<<endl
#define p7(a,b,c,d,e,f,g)       idp cout<<a<<"\t"<<b<<"\t"<<c<<"\t"<<d<<"\t"<<e<<"\t"<<f<<"\t"<<g<<endl
#define p8(a,b,c,d,e,f,g,h)     idp cout<<a<<"\t"<<b<<"\t"<<c<<"\t"<<d<<"\t"<<e<<"\t"<<f<<"\t"<<g<<"\t"<<h<<endl
#define p9(a,b,c,d,e,f,g,h,i)       idp cout<<a<<"\t"<<b<<"\t"<<c<<"\t"<<d<<"\t"<<e<<"\t"<<f<<"\t"<<g<<"\t"<<h<<"\t"<<i<<endl
#define p10(a,b,c,d,e,f,g,h,i,j)        idp cout<<a<<"\t"<<b<<"\t"<<c<<"\t"<<d<<"\t"<<e<<"\t"<<f<<"\t"<<g<<"\t"<<h<<"\t"<<i<<"\t"<<j<<endl
#define foreach(it,v)   for(__typeof((v).begin()) it=(v).begin(); it!=(v).end(); ++it)
#define p2p(x)      idp p2((x).F, (x).S)
#define dump(x,n)   idp{rep(i,n){cout<<x[i]<<" ";}puts("");}
#define dump2(x,n)  idp{rep(i,n){cout<<"["<<x[i].F<<" , "<<x[i].S<<"] ";}puts("");}
#define dumpi(x)    idp{foreach(it, x){cout<<(*it)<<" ";}puts("");}
#define dumpi2(x)   idp{foreach(it, x){cout<<"["<<(it)->F<<" , "<<(it)->S<<"] ";}puts("");}

#define read2d(a,w,h)   rep(i,h)rep(j,w)cin>>a[i][j]
#define dump2d(a,w,h)   rep(i,h){rep(j,w)cout<<a[i][j]<<" ";puts("");}

typedef pair<li, li> PI;

li num[100100];
PI bounds[100100];

vector<li> edges[100100];
li n, k;

inline bool check(li x, li y) {
    return ((x + bit(40)) % 2) == ((y + bit(40)) % 2);
}

inline PI dfs(li now, li from, li lower, li upper) {
    PI res{lower, upper};
    if (num[now] != -1) {
        if (lower != -INF && upper != INF) {
            if (!check(lower, num[now]) ||
                    !check(upper, num[now]) ||
                    lower > num[now] ||
                    upper < num[now]) {
                puts("No");
                exit(0);
            }
        }
        res = {num[now], num[now]};
        lower = num[now];
        upper = num[now];
    }
    li next_lower = (lower == -INF ? -INF : lower - 1);
    li next_upper = (upper == INF ? INF : upper + 1);
    for (auto next : edges[now]) {
        if (next == from)continue;
        PI next_bound = dfs(next, now, next_lower, next_upper);
        if (res.F != -INF &&
                next_bound.F != -INF &&
                !check(res.F, next_bound.F)) {
            puts("No");
            exit(0);
        }
        res.F = max(res.F, next_bound.F);
        res.S = min(res.S, next_bound.S);
    }
    if (res.F > res.S) {
        puts("No");
        exit(0);
    }
    bounds[now] = res;
    if (res.F == -INF) {
        return res;
    }
    return {res.F - 1, res.S + 1};
}


inline PI dfs2(li now, li from, li lower, li upper) {
    if (bounds[now].F != -INF &&
            !check(bounds[now].F, lower)) {
        puts("No");
        exit(0);
    }
    if (bounds[now].S != INF &&
            !check(bounds[now].S, upper)) {
        puts("No");
        exit(0);
    }
    if (bounds[now].F == -INF) {
        bounds[now].F = lower;
    } else {
        bounds[now].F = max(bounds[now].F, lower);
    }
    if (bounds[now].S == INF) {
        bounds[now].S = upper;
    } else {
        bounds[now].S = min(bounds[now].S, upper);
    }
    if (bounds[now].F > bounds[now].S) {
        puts("No");
        exit(0);
    }

    for (auto next : edges[now]) {
        if (next == from)continue;
        PI next_bound = dfs2(next, now, bounds[now].F - 1, bounds[now].S + 1);
        if (!check(bounds[now].F, next_bound.F)) {
            puts("No");
            exit(0);
        }
        bounds[now].F = max(bounds[now].F, next_bound.F);
        bounds[now].S = min(bounds[now].S, next_bound.S);
    }

    if (bounds[now].F > bounds[now].S) {
        puts("No");
        exit(0);
    }
    return {bounds[now].F - 1, bounds[now].S + 1};
}


int main() {
    cin >> n;
    rin{
        num[i] = -1;
        bounds[i].F = -INF;
        bounds[i].S = INF;
    }
    rep(i, n - 1) {
        li a, b;
        cin >> a >> b;
        a--;
        b--;
        edges[a].pb(b);
        edges[b].pb(a);
    }
    cin >> k;
    rep(i, k) {
        li v, p;
        cin >> v >> p;
        v--;
        num[v] = p;
    }

    dfs(0, -1, bounds[0].F, bounds[0].S);
    //rin{p2p(bounds[i]);}
    dfs2(0, -1, bounds[0].F, bounds[0].S);

    puts("Yes");
    rin{
        cout << bounds[i].S << endl;
    }

    return 0;
}

Measured memory_bytes: 16128