use proconio::{input, fastout};
use std::cmp::max;
use itertools::Itertools;


#[fastout]
fn main() {
    input! {
        n: usize,
        sss: [u8; n],
        ttt: [u8; n],
        uuu: [u64; n],
        vvv: [u64; n],
    }

    let mut ans = vec![vec![0; n]; n];
    let mut k = 1u64;

    let max_uv: u64 = *max(uuu.iter().max().unwrap(), vvv.iter().max().unwrap());

    while k <= max_uv && k != 0 {
        let mut ambiguous: Vec<Vec<Vec<usize>>> = vec![vec![vec![]; 2]; 2];
        let mut filled = [[false, false], [false, false]];
        for i in 0..n {
            let s = sss[i] as usize;
            let u = (uuu[i] & k != 0) as usize;
            if s ^ u == 1 {
                if u == 1 { for j in 0..n { ans[i][j] |= k } }
                filled[0][u] = true;
            } else {
                ambiguous[0][u].push(i);
            }
        }
        for j in 0..n {
            let t = ttt[j] as usize;
            let v = (vvv[j] & k != 0) as usize;
            if t ^ v == 1 {
                if filled[0][v ^ 1] {
                    println!("-1");
                    return;
                }
                if v == 1 { for i in 0..n { ans[i][j] |= k } }
                filled[1][v] = true;
            } else {
                ambiguous[1][v].push(j);
            }
        }

        let amb_i_cnt = ambiguous[0][0].len() + ambiguous[0][1].len();
        let amb_j_cnt = ambiguous[1][0].len() + ambiguous[1][1].len();

        if amb_i_cnt == 0 || amb_j_cnt == 0 {
            let ij = if amb_i_cnt == 0 { 0 } else { 1 };
            for b in 0..2 {
                if !ambiguous[ij ^ 1][b].is_empty() && !filled[ij][b] {
                    println!("-1");
                    return;
                }
            }
        } else if amb_i_cnt == 1 {
            let b = if ambiguous[0][0].len() == 1 { 0 } else { 1 };
            let i = &ambiguous[0][b][0];
            if ambiguous[1][b].len() > 0 || filled[1][b] {
                for j in &ambiguous[1][1] { ans[*i][*j] |= k; }
            } else if filled[0][b ^ 1] {
                if b == 1 { for j in &ambiguous[1][b ^ 1] { ans[*i][*j] |= k; } }
            } else {
                println!("-1");
                return;
            }
        } else if amb_j_cnt == 1 {
            let b = if ambiguous[1][0].len() == 1 { 0 } else { 1 };
            let j = &ambiguous[1][b][0];
            if ambiguous[0][b].len() > 0 || filled[0][b] {
                for i in &ambiguous[0][1] { ans[*i][*j] |= k; }
            } else if filled[1][b ^ 1] {
                if b == 1 { for i in &ambiguous[0][b ^ 1] { ans[*i][*j] |= k; } }
            } else {
                println!("-1");
                return;
            }
        } else {
            let mut amb0 = ambiguous[0][0].clone();
            let mut amb1 = ambiguous[1][0].clone();
            amb0.append(&mut ambiguous[0][1]);
            amb1.append(&mut ambiguous[1][1]);
            for (bi, i) in amb0.iter().enumerate() {
                for (bj, j) in amb1.iter().enumerate() {
                    if (bi ^ bj) & 1 == 1 { ans[*i][*j] |= k; }
                }
            }
        }

        k <<= 1;
    }

    for row in ans {
        println!("{}", row.iter().join(" "));
    }
}


Measured memory_bytes: 7448