#include<bits/stdc++.h>
using namespace std;
int p,q,r,m,a,b,ans=0;
vector<int>v[60010];
struct no{
int ver;// 第幾號門第幾個位置 number 3 kind cata
int nv=-1;// 輸入值 input door val 1
int ki=-1;// 是and還是or..... logic door cata //2
int x=-1; //第一個輸入 //2
int y=-1;// 第二個輸入 logic input //2
int out=0;//這個門的輸出值 2 or 3
int cnt=0;//經過幾個閘門 door num every
}he[60010];
queue<no>qqq;
int main(){
cin>>p>>q>>r>>m;
for(int i=1;i<=p;i++){
cin>>he[i].nv;
}
for(int i=p+1;i<=p+q;i++){
cin>>he[i].ki;
}
for(int i=1;i<=m;i++){
cin>>a>>b;
v[a].push_back(b);
}
for(int i=1;i<=p;i++){
qqq.push({i,he[i].nv,-1,-1,-1,0,0});
}
while(!qqq.empty()){
no it=qqq.front();
qqq.pop();
//cout<<it.ver<<endl;
if(it.ver<=p){// 1
for(int i=0;i<v[it.ver].size();i++){
if(v[it.ver][i]<=p+q){//2
if(he[v[it.ver][i]].x==-1){
he[v[it.ver][i]].x=it.nv;
}else if(he[v[it.ver][i]].x!=-1&&he[v[it.ver][i]].y==-1){
he[v[it.ver][i]].y=it.nv;
}
qqq.push({v[it.ver][i],he[v[it.ver][i]].nv,he[v[it.ver][i]].ki,he[v[it.ver][i]].x,he[v[it.ver][i]].y,he[v[it.ver][i]].out,max(he[v[it.ver][i]].cnt,it.cnt+1)});
}else{//3
he[v[it.ver][i]].out=it.nv;
he[v[it.ver][i]].cnt=it.cnt;
}
}
}else{//2
if(he[it.ver].y==-1&&he[it.ver].ki!=4){
qqq.push(it);
}else{
int kk;
if(he[it.ver].ki==1){
kk=(he[it.ver].x&&he[it.ver].y);
}else if(he[it.ver].ki==2){
kk=(he[it.ver].x||he[it.ver].y);
}else if(he[it.ver].ki==3){
kk=(he[it.ver].x^he[it.ver].y);
}else if(he[it.ver].ki==4){
kk=(!he[it.ver].x);
}
he[it.ver].out=kk;
for(int i=0;i<v[it.ver].size();i++){
if(v[it.ver][i]<=p+q){//2
if(he[v[it.ver][i]].x==-1){
he[v[it.ver][i]].x=kk;
}else if(he[v[it.ver][i]].x!=-1&&he[v[it.ver][i]].y==-1){
he[v[it.ver][i]].y=kk;
}
qqq.push({v[it.ver][i],he[v[it.ver][i]].nv,he[v[it.ver][i]].ki,he[v[it.ver][i]].x,he[v[it.ver][i]].y,he[v[it.ver][i]].out,max(he[v[it.ver][i]].cnt,it.cnt+1)});
}else{//3;
he[v[it.ver][i]].out=kk;
he[v[it.ver][i]].cnt=it.cnt;
}
}
}
}
}
for(int i=p+q+1;i<=p+q+r;i++){
ans=max(ans,he[i].cnt);
}
cout<<ans<<endl;
for(int i=p+q+1;i<=p+q+r;i++){
cout<<he[i].out<<" ";
}
}