#include <bits/stdc++.h>
using namespace std;
int OK = 1;
const int INF = 0x3f3f3f3f;
const int maxn = 210;
int maze[maxn][maxn];
int gap[maxn], dis[maxn], pre[maxn], cur[maxn];
int flow[maxn][maxn];
int sap(int st, int ed, int n) {
  memset((cur), 0, sizeof(cur));
  memset((dis), 0, sizeof(dis));
  memset((gap), 0, sizeof(gap));
  memset((flow), 0, sizeof(flow));
  int u = pre[st] = st, maxflow = 0, aug = -1;
  gap[0] = n;
  while (dis[st] < n) {
  loop:
    for (int v = cur[u]; v < n; v++) {
      if (maze[u][v] - flow[u][v] && dis[u] == dis[v] + 1) {
        if (aug == -1 || aug > maze[u][v] - flow[u][v])
          aug = maze[u][v] - flow[u][v];
        pre[v] = u;
        u = cur[u] = v;
        if (v == ed) {
          maxflow += aug;
          for (u = pre[u]; v != st; v = u, u = pre[u]) {
            flow[u][v] += aug;
            flow[v][u] -= aug;
          }
          aug = -1;
        }
        goto loop;
      }
    }
    int mindis = n - 1;
    for (int v = 0; v < n; v++)
      if (maze[u][v] - flow[u][v] && mindis > dis[v]) {
        cur[u] = v;
        mindis = dis[v];
      }
    if ((--gap[dis[u]]) == 0) break;
    gap[dis[u] = mindis + 1]++;
    u = pre[u];
  }
  return maxflow;
}
int n, m, ans[maxn];
int main() {
  scanf("%d%d", &n, &m);
  int ss = 0, tt = 2 * n + 1;
  int w, sum1 = 0, sum2 = 0;
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &w);
    maze[ss][i] = w;
    sum1 += w;
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &w);
    maze[i + n][tt] = w;
    sum2 += w;
  }
  for (int i = 1; i <= n; ++i) {
    maze[i][i + n] = 10000000;
  }
  if (sum1 != sum2) {
    puts("NO");
    return 0;
  }
  int u, v;
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", &u, &v);
    maze[u][v + n] = 10000000;
    maze[v][u + n] = 10000000;
  }
  int mxf = sap(ss, tt, n * 2 + 2);
  if (mxf != sum1) {
    puts("NO");
  } else {
    puts("YES");
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= n; ++j) cout << flow[i][j + n] << " ";
      cout << endl;
    }
  }
  return 0;
}
