#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 300;
const int INF = (int)1e9;
int A[MAX_N][MAX_N];
int maze[MAX_N][MAX_N];
int gap[MAX_N], dis[MAX_N], pre[MAX_N], cur[MAX_N];
int sap(int start, int end, int nodeNum) {
  memset(cur, 0, sizeof(cur));
  memset(dis, 0, sizeof(dis));
  memset(gap, 0, sizeof(gap));
  int u = pre[start] = start, maxFlow = 0, aug = -1;
  gap[0] = nodeNum;
  while (dis[start] < nodeNum) {
  loop:
    for (int v = cur[u]; v < nodeNum; v++)
      if (maze[u][v] && dis[u] == dis[v] + 1) {
        if (aug == -1 || aug > maze[u][v]) aug = maze[u][v];
        pre[v] = u;
        u = cur[u] = v;
        if (v == end) {
          maxFlow += aug;
          for (u = pre[u]; v != start; v = u, u = pre[u]) {
            maze[u][v] -= aug;
            maze[v][u] += aug;
          }
          aug = -1;
        }
        goto loop;
      }
    int minDist = nodeNum - 1;
    for (int v = 0; v < nodeNum; v++)
      if (maze[u][v] && minDist > dis[v]) {
        cur[u] = v;
        minDist = dis[v];
      }
    if ((--gap[dis[u]]) == 0) break;
    gap[dis[u] = minDist + 1]++;
    u = pre[u];
  }
  return maxFlow;
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  int sum = 0;
  int src = 0;
  int dst = 2 * n + 1;
  int x;
  memset(maze, 0, sizeof(maze));
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &x);
    maze[src][i] = x;
    sum += x;
  }
  int sum1 = 0;
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &x);
    maze[n + i][dst] = x;
    sum1 += x;
  }
  int u, v;
  while (m--) {
    scanf("%d %d", &u, &v);
    maze[u][v + n] = INF;
    maze[v][u + n] = INF;
  }
  for (int i = 1; i <= n; ++i) {
    maze[i][i + n] = INF;
  }
  memcpy(A, maze, sizeof(A));
  int ans = sap(0, 2 * n + 1, 2 * n + 2);
  if (ans == sum && ans == sum1) {
    puts("YES");
    for (int i = 1; i <= n; ++i) {
      for (int j = n + 1; j < 2 * n + 1; ++j) {
        printf("%d ", A[i][j] - maze[i][j]);
      }
      puts("");
    }
  } else {
    puts("NO");
  }
  return 0;
}
