import java.util.*; import java.io.*; import java.text.*; //Solution Credits: Taranpreet Singh public class Main{ //SOLUTION BEGIN void solve(int TC) throws Exception{ int n = ni(), m = ni(); int[][] A = new int[n+m][], C = new int[n][m]; for(int i = 0; i< n+m; i++)A[i] = new int[]{ni(), ni()}; int[][] set = new int[n+m][]; for(int i = 0; i< n+m; i++)set[i] = new int[]{i, 0}; boolean yes = true; for(int i = 0; i< n; i++) for(int j = 0; j< m; j++){ C[i][j] = ni(); if(C[i][j]!=-1){ if(find(set, i)!=find(set, j+n))union(set, i, j+n, C[i][j]); else if((set[i][1]^set[j+n][1])!=C[i][j])yes = false; } } if(!yes){pn("NO");return;} int[] nxt = new int[n+m], prev = new int[n+m]; Arrays.fill(nxt, -1);Arrays.fill(prev, -1); for(int i = n+m-1; i>= 0; i--){ if(prev[find(set, i)]!=-1)nxt[i] = prev[find(set, i)]; prev[find(set, i)] = i; } int[] xor = new int[n+m], ans = new int[n+m]; int[][][] lim = new int[B+1][n+m][2]; for(int i = 0; i< n+m; i++)lim[B][i] = new int[]{A[i][0], A[i][1]}; for(int i = 0; i< n+m; i++)xor[i] = set[i][1]; for(int i = 0; i< n+m; i++){ if(prev[i]==-1)continue; if(xor[i]!=0)throw new Exception("Hold Right There, Sparky!"); yes &= solve(lim, nxt, xor, i, B-1); for(int j = i; j!=-1 && yes; j = nxt[j]){ if(lim[0][j][0]!=lim[0][j][1])throw new Exception("Hold Right There, Sparky!"); ans[j] = lim[0][j][0]; } } if(yes){ pn("YES"); for(int i = 0; i< n; i++)p(ans[i]+" ");pn(""); for(int i = 0; i< m; i++)p(ans[i+n]+" ");pn(""); }else pn("NO"); } int B = 30, all = (1<>bit)&1); int x = lim[bit+1][i][0]&(all^((1<<(1+bit))-1)); int le = x|(bi<lim[bit+1][i][1] || ri< lim[bit+1][i][0])flag = false; } if(flag){ for(int i = pos; i!=-1; i = nxt[i]){ int bi = c^((xor[i]>>bit)&1); int x = lim[bit+1][i][0]&(all^((1<<(1+bit))-1)); int le = x|(bi<