#include <stdio.h>
#define N 2005
int n, m, i, j, k, a, b;
int h[N], q[N], p[N], v[N], c[N], f[N][N];
struct AB{
int a, b, n;
} d[N*2];
void cun(int a, int b){
d[++k].a = a, d[k].b = b;
d[k].n = h[a], h[a] = k;
}
void bfs(int *f, int a, int x){
int b, i, j, k;
f[a] = 1, q[1] = a;
for(i=j=1; i<=j; i++){
a = q[i];
if(f[a]-1 < x) c[a] = 1;//距离太近,不能涂色
for(k=h[a]; k; k=d[k].n){
b = d[k].b;
if(!f[b]){
f[b] = f[a] + 1;
q[++j] = b;
}
}
}
}
int main(){
scanf("%d%d", &n, &m);
for(i=1; i<=m; i++){
scanf("%d%d", &a, &b);
cun(a, b);
cun(b, a);
}
scanf("%d", &k);
for(i=1; i<=k; i++){
scanf("%d%d", &p[i], &v[i]);
bfs(f[p[i]], p[i], v[i]);
}//预处理任意两点距离,并标记不能涂色的点
for(i=1; a=p[i]; i++){
for(b=1; b<=n; b++){
if(!c[b] && f[a][b]-1==v[i]) break;
}//其他点涂色,必须有距离相等的
if(b > n) break;
}
if(a == 0){
printf("Yes\n");
for(i=1; i<=n; i++){
printf("%d", c[i]^1);//1不涂色,0涂色
}
}
else printf("No\n");
return 0;
}