#include <bits/stdc++.h>
using namespace std;
int n, m, num = 1, S, T, head[205], lev[205], iter[205], que[205],
          ans[205][205];
struct edge {
  int to, next, w;
} g[205 << 4];
bool bfs() {
  memset(lev, 0, sizeof(lev));
  memcpy(iter, head, sizeof(head));
  int h = 1, t = 1;
  que[1] = S;
  lev[S] = 1;
  while (h <= t) {
    int tmp = que[h++];
    for (int i = head[tmp]; i; i = g[i].next)
      if (!lev[g[i].to] && g[i].w)
        lev[g[i].to] = lev[tmp] + 1, que[++t] = g[i].to;
  }
  return lev[T] != 0;
}
int dfs(int u, int flow) {
  if (u == T) return flow;
  int used = 0;
  for (int &i = iter[u]; i; i = g[i].next)
    if (g[i].w && lev[g[i].to] == lev[u] + 1) {
      int qaq = dfs(g[i].to, min(flow - used, g[i].w));
      if (qaq) {
        g[i].w -= qaq, g[i ^ 1].w += qaq, used += qaq;
        if (used == flow) return flow;
      }
    }
  return used;
}
int dinic() {
  int tot = 0, now;
  while (bfs()) do
      now = dfs(S, 0x3f3f3f3f), tot += now;
    while (now);
  return tot;
}
void ins(int u, int v, int w) {
  g[++num].next = head[u];
  head[u] = num;
  g[num].to = v;
  g[num].w = w;
}
void insw(int u, int v, int w) {
  ins(u, v, w);
  ins(v, u, 0);
}
int main() {
  scanf("%d%d", &n, &m);
  S = 0, T = 2 * n + 1;
  int x, y, cntx = 0, cnty = 0;
  for (int i = 1; i <= n; i++) scanf("%d", &x), insw(S, i, x), cntx += x;
  for (int i = 1; i <= n; i++) insw(i, i + n, 0x3f3f3f3f);
  for (int i = 1; i <= n; i++) scanf("%d", &x), insw(i + n, T, x), cnty += x;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    insw(x, y + n, 0x3f3f3f3f);
    insw(y, x + n, 0x3f3f3f3f);
  }
  int tmp = dinic();
  if (cntx == cnty && tmp == cnty) {
    puts("YES");
    for (int i = 1; i <= n; i++)
      for (int j = head[i + n]; j; j = g[j].next)
        if (g[j].to >= 1 && g[j].to <= n) ans[g[j].to][i] = g[j].w;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) printf("%d ", ans[i][j]);
      puts("");
    }
  } else
    puts("NO");
}
