#include <bits/stdc++.h>
using namespace std;
vector<int> solveb(int N, int M, const vector<int>& A, const vector<int>& B,
                   int bit) {
  vector<vector<char>> mtx(N + M, vector<char>(N * M));
  for (int m = 0; m < M; ++m) {
    for (int i = m; i < N * M; i += M) mtx[m][i] = 1;
  }
  for (int n = 0; n < N; ++n) {
    for (int i = 0; i < M; ++i) {
      mtx[M + n][n * M + i] = 1;
    }
  }
  vector<char> vec(N + M);
  for (int m = 0; m < M; ++m) {
    vec[m] = (B[m] >> bit) & 1;
  }
  for (int n = 0; n < N; ++n) {
    vec[M + n] = (A[n] >> bit) & 1;
  }
  int H = N + M;
  int W = N * M;
  int ox = 0;
  int bottomy = H;
  for (int oy = 0; oy < H; ++oy) {
    if (ox == W) {
      bottomy = oy;
      break;
    }
    if (mtx[oy][ox] == 0) {
      bool rep;
      do {
        rep = false;
        for (int y = oy + 1; y < H; ++y) {
          if (mtx[y][ox] == 1) {
            swap(mtx[oy], mtx[y]);
            swap(vec[oy], vec[y]);
          }
        }
        if (mtx[oy][ox] == 0) {
          ++ox;
          if (ox < W) rep = true;
        }
      } while (rep);
    }
    if (ox == W) {
      bottomy = oy;
      break;
    }
    for (int y = oy + 1; y < H; ++y) {
      if (mtx[y][ox] == 1) {
        for (int x = ox; x < W; ++x) {
          mtx[y][x] ^= mtx[oy][x];
        }
        vec[y] ^= vec[oy];
      }
    }
    ++ox;
  }
  for (int y = bottomy; y < H; ++y) {
    if (vec[y] == 1) return vector<int>();
  }
  for (int oy = bottomy - 1; oy >= 0; --oy) {
    int ox = -1;
    for (int x = 0; x < W; ++x) {
      if (mtx[oy][x] == 1) {
        ox = x;
        break;
      }
    }
    assert(ox != -1);
    for (int y = 0; y < oy; ++y) {
      if (mtx[y][ox] == 1) {
        for (int x = 0; x < W; ++x) {
          mtx[y][x] ^= mtx[oy][x];
        }
        vec[y] ^= vec[oy];
      }
    }
  }
  vector<int> ans(N * M);
  for (int y = 0; y < bottomy; ++y) {
    int ox = -1;
    for (int x = 0; x < W; ++x) {
      if (mtx[y][x] == 1) {
        ox = x;
        break;
      }
    }
    assert(ox != -1);
    ans[ox] = vec[y];
  }
  return ans;
}
vector<int> solve(int N, int M, const vector<int>& A, const vector<int>& B) {
  vector<int> ans(N * M);
  for (int bit = 0; bit <= 30; ++bit) {
    vector<int> ansb = solveb(N, M, A, B, bit);
    if (ansb.empty()) return vector<int>();
    for (int i = 0; i < N * M; ++i) {
      ans[i] |= (ansb[i] << bit);
    }
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int N, M;
  cin >> N >> M;
  vector<int> A(N);
  for (int& a : A) cin >> a;
  vector<int> B(M);
  for (int& b : B) cin >> b;
  vector<int> ans = solve(N, M, A, B);
  if (ans.empty()) {
    cout << "NO\n";
  } else {
    cout << "YES\n";
    for (int y = 0; y < N; ++y) {
      for (int x = 0; x < M; ++x) {
        if (x > 0) cout << ' ';
        cout << ans[y * M + x];
      }
      cout << '\n';
    }
  }
  return 0;
}
