#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int inf = 1e9;
struct node {
  int to, next, flow;
} p[maxn << 1];
int head[maxn], cur[maxn], dep[maxn], s, t, n, m, cnt = -1, be[maxn], ed[maxn];
int ans[maxn][maxn];
void add(int x, int y, int flow) {
  p[++cnt].next = head[x];
  p[cnt].to = y;
  p[cnt].flow = flow;
  head[x] = cnt;
}
queue<int> q;
bool bfs() {
  memset(dep, 0, sizeof(dep));
  while (!q.empty()) q.pop();
  for (int i = 0; i <= 2 * n + 1; i++) cur[i] = head[i];
  dep[s] = 1;
  q.push(s);
  while (!q.empty()) {
    int now = q.front();
    q.pop();
    for (int k = head[now]; k != -1; k = p[k].next) {
      int x = p[k].to;
      if (!dep[x] && p[k].flow > 0) {
        dep[x] = dep[now] + 1;
        q.push(x);
      }
    }
  }
  return dep[t] != 0;
}
int dfs(int now, int limit) {
  if (!limit || now == t) return limit;
  int flow = 0, ins;
  for (int k = cur[now]; k != -1; k = p[k].next) {
    cur[now] = k;
    int x = p[k].to;
    if (dep[x] == dep[now] + 1 && (ins = dfs(x, min(limit, p[k].flow)))) {
      flow += ins;
      limit -= ins;
      p[k].flow -= ins;
      p[k ^ 1].flow += ins;
      if (!limit) break;
    }
  }
  return flow;
}
bool dinic(int tar) {
  int maxflow = 0;
  while (bfs()) maxflow += dfs(s, inf);
  return maxflow == tar;
}
int main() {
  scanf("%d%d", &n, &m);
  s = 0, t = 2 * n + 1;
  int tar = 0, tol = 0;
  memset(head, -1, sizeof(head));
  for (int i = 1; i <= n; i++) {
    scanf("%d", &be[i]);
    tol += be[i];
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", &ed[i]);
    tar += ed[i];
  }
  for (int i = 1; i <= n; i++) {
    add(s, i, be[i]);
    add(i, s, 0);
    add(i, i + n, inf);
    add(i + n, i, 0);
    add(i + n, t, ed[i]);
    add(t, i + n, 0);
  }
  int x, y;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    add(x, y + n, inf);
    add(y + n, x, 0);
    add(y, x + n, inf);
    add(x + n, y, 0);
  }
  if (dinic(tol) && tol == tar) {
    printf("YES\n");
    for (int i = 1; i <= n; i++) {
      for (int k = head[i]; k != -1; k = p[k].next) {
        x = p[k].to;
        if (x > n) ans[i][x - n] = p[k ^ 1].flow;
      }
    }
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if (j - 1) printf(" ");
        printf("%d", ans[i][j]);
      }
      printf("\n");
    }
  } else
    printf("NO\n");
  return 0;
}
