#include <bits/stdc++.h>
using namespace std;
const int __ = 505;
int b[__][10005];
int fi[__];
int xorxy(int n, int m) {
  int i = 1;
  for (int j = 1; i <= n && j <= m; j++) {
    int x = 0;
    for (int k = i; k <= n; k++)
      if (b[k][j]) {
        x = k;
        break;
      }
    if (!x) continue;
    for (int k = j; k <= m; k++) swap(b[i][k], b[x][k]);
    for (int k = 1; k <= n; k++) {
      if (k == i || !b[k][j]) continue;
      for (int l = j; l <= m; l++) b[k][l] ^= b[i][l];
    }
    fi[i] = j;
    i++;
  }
  return i - 1;
}
int a[3][__], ans[__][__];
bool vis[__];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = (1); i <= (n); ++i) scanf("%d", &a[1][i]);
  for (int i = (1); i <= (m); ++i) scanf("%d", &a[2][i]);
  int idx = 0, z = n * m + 1;
  for (int i = (1); i <= (n); ++i) {
    ++idx;
    for (int j = (1); j <= (m); ++j) b[idx][(i - 1) * m + j] = 1;
    b[idx][n * m + 1] = a[1][i];
  }
  for (int j = (1); j <= (m); ++j) {
    ++idx;
    for (int i = (1); i <= (n); ++i) b[idx][(i - 1) * m + j] = 1;
    b[idx][n * m + 1] = a[2][j];
  }
  int x = xorxy(idx, z);
  for (int i = (1); i <= (idx); ++i) {
    bool flag = false;
    for (int j = (1); j <= (z - 1); ++j)
      if (b[i][j]) {
        flag = true;
        break;
      }
    if (!flag && b[i][z]) return !printf("NO\n");
  }
  for (int i = (1); i <= (idx); ++i)
    if (fi[i] && b[i][fi[i]])
      ans[(fi[i] - 1) / m + 1][(fi[i] - 1) % m + 1] = b[i][z];
  puts("YES");
  for (int i = (1); i <= (n); ++i)
    for (int j = (1); j <= (m); ++j) printf("%d%c", ans[i][j], " \n"[j == m]);
  return 0;
}
