#include <bits/stdc++.h>
using namespace std;
const int maxn = 2000 + 10, inf = 1e9, N = 210;
int from[maxn], to[maxn], cap[maxn], head[maxn], prv[maxn], n;
int a[maxn];
int b[N][N];
bool mark[maxn];
int ecnt;
void ad_e(int u, int v, int uv, int vu = 0) {
  from[ecnt] = u, to[ecnt] = v, cap[ecnt] = uv, prv[ecnt] = head[u],
  head[u] = ecnt++;
  from[ecnt] = v, to[ecnt] = u, cap[ecnt] = vu, prv[ecnt] = head[v],
  head[v] = ecnt++;
}
int dfs(int v, int sink, int f = inf) {
  if (v == sink) return f;
  if (mark[v]) return 0;
  mark[v] = 1;
  for (int i = head[v]; i != -1; i = prv[i]) {
    if (cap[i]) {
      int x = dfs(to[i], sink, min(f, cap[i]));
      if (x) {
        cap[i] -= x;
        cap[i ^ 1] += x;
        return x;
      }
    }
  }
  return 0;
}
int flow(int source, int sink) {
  int f = 0, x = 0;
  memset(mark, 0, sizeof mark);
  while (x = dfs(source, sink)) {
    memset(mark, 0, sizeof mark);
    f += x;
  }
  return f;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  memset(head, -1, sizeof head);
  int sum1 = 0, sum2 = 0;
  for (int i = 1; i <= n * 2; i++) {
    cin >> a[i];
    if (i <= n)
      sum1 += a[i];
    else
      sum2 += a[i];
  }
  if (sum1 != sum2) {
    cout << "NO\n";
    return 0;
  }
  for (int i = 1; i <= n; i++) ad_e(0, i, a[i]);
  for (int i = n + 1; i <= 2 * n; i++) ad_e(i, 2 * n + 1, a[i]);
  for (int i = 1; i <= n; i++) ad_e(i, i + n, inf, 0);
  for (int i = m; i--;) {
    int u, v;
    cin >> u >> v;
    ad_e(u, v + n, inf);
    ad_e(v, u + n, inf);
  }
  int f = flow(0, 2 * n + 1);
  if (f != sum1) {
    cout << "NO\n";
    return 0;
  }
  cout << "YES" << endl;
  for (int i = 1; i <= n; i++) {
    for (int j = head[i]; j != -1; j = prv[j]) {
      int u = to[j];
      if (u > n && u <= 2 * n) b[i - 1][u - 1 - n] = abs(inf - cap[j]);
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) cout << b[i][j] << " ";
    cout << endl;
  }
}
