#include <bits/stdc++.h>
using namespace std;
const int N = 511;
int mat[N][N], n, m, a[N], b[N], p[N], u, v;
vector<int> g[N * 10];
const int SOURCE = 0;
const int SINK = 302;
const int INF = 1e9;
int sumA = 0;
int sumB = 0;
int mxFlow = 0;
queue<int> q;
bool vis[N];
int maxFlow() {
  int res = 0;
  while (1) {
    memset(vis, 0, sizeof vis);
    while (!q.empty()) q.pop();
    q.push(SOURCE);
    while (!q.empty()) {
      int src = q.front();
      q.pop();
      if (src == SINK) break;
      for (int i = 0; i < g[src].size(); i++) {
        int v = g[src][i];
        if (!vis[v] && mat[src][v] > 0) {
          vis[v] = 1;
          p[v] = src;
          q.push(v);
        }
      }
    }
    if (!vis[SINK]) break;
    int f = INF;
    int cur = SINK;
    while (cur != SOURCE) {
      int prev = cur;
      cur = p[cur];
      f = min(mat[cur][prev], f);
    }
    res += f;
    cur = SINK;
    while (cur != SOURCE) {
      int prev = cur;
      cur = p[cur];
      mat[cur][prev] -= f;
      mat[prev][cur] += f;
    }
  }
  return res;
}
void addEdge(int u, int v, int cost) {
  g[u].push_back(v);
  g[v].push_back(u);
  mat[u][v] = cost;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
    sumA += a[i];
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &b[i]);
    sumB += b[i];
    mxFlow += b[i];
  }
  for (int i = 1; i <= n; ++i) {
    addEdge(i, i + n, INF);
  }
  for (int i = 1; i <= n; i++) {
    addEdge(SOURCE, i, a[i]);
  }
  for (int i = n + 1; i <= 2 * n; i++) {
    addEdge(i, SINK, b[i - n]);
  }
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", &u, &v);
    addEdge(u, v + n, INF);
    addEdge(v, u + n, INF);
  }
  int res = maxFlow();
  if (res == mxFlow && sumB == sumA) {
    puts("YES");
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= n; ++j) {
        if (j != 1) printf(" ");
        printf("%d", mat[j + n][i]);
      }
      puts("");
    }
  } else {
    puts("NO");
  }
  return 0;
}
