#include <bits/stdc++.h>
using namespace std;
int adj[205][205];
int rgraph[205][205];
int n, m;
int parent[205];
bool visited[205];
int a[105];
int b[105];
bool bfs(int s, int t) {
  memset(visited, 0, sizeof(visited));
  queue<int> q;
  q.push(s);
  visited[s] = true;
  parent[s] = -1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i <= 2 * n + 1; i++) {
      if (!visited[i] && rgraph[u][i] > 0) {
        q.push(i);
        parent[i] = u;
        visited[i] = true;
      }
    }
  }
  return visited[t] == true;
}
int solve(int s, int t) {
  for (int i = 0; i <= 2 * n + 1; i++) {
    for (int j = 0; j <= 2 * n + 1; j++) {
      rgraph[i][j] = adj[i][j];
    }
  }
  int max_flow = 0;
  while (bfs(0, 2 * n + 1)) {
    int path = 2000000000;
    for (int i = t; i != s; i = parent[i]) {
      int u = parent[i];
      path = min(path, rgraph[u][i]);
    }
    for (int i = t; i != s; i = parent[i]) {
      int u = parent[i];
      rgraph[u][i] -= path;
      rgraph[i][u] += path;
    }
    max_flow += path;
  }
  return max_flow;
}
int main() {
  cin >> n >> m;
  int suma = 0, sumb = 0;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    adj[0][i] = a[i];
    suma += a[i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> b[i];
    adj[n + i][2 * n + 1] = b[i];
    sumb += b[i];
    adj[i][n + i] = 1000000;
  }
  for (int i = 0; i < m; i++) {
    int c, d;
    cin >> c >> d;
    adj[c][n + d] = 1000000;
    adj[d][n + c] = 1000000;
  }
  int ans = solve(0, 2 * n + 1);
  if (ans == suma && ans == sumb) {
    printf("YES\n");
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if (rgraph[i][n + j] != 0)
          printf("%d ", 1000000 - rgraph[i][n + j]);
        else
          printf("%d ", rgraph[i][n + j]);
      }
      printf("\n");
    }
  } else {
    printf("NO\n");
  }
}
