#include <bits/stdc++.h>
using namespace std;
const int N = 300;
int s = 0, t = 210;
int n, m, res[N][N], flow[N][N];
int p[N], sr, ss, f;
int in(int u) { return u; }
int out(int u) { return n + u; }
bool bfs() {
  queue<int> q;
  q.push(s);
  vector<int> mark(t + 1, 0);
  mark[s] = 1;
  memset(p, -1, sizeof p);
  while (!q.empty()) {
    int u = q.front();
    if (u == t) return true;
    q.pop();
    for (int i = 0; i < t + 1; i++)
      if ((res[u][i] - flow[u][i] > 0) && !mark[i]) {
        p[i] = u;
        mark[i] = 1;
        q.push(i);
      }
  }
  return false;
}
void aug(int w, int mw) {
  if (w == s)
    f = mw;
  else if (p[w] != -1) {
    aug(p[w], min(mw, res[p[w]][w] - flow[p[w]][w]));
    flow[p[w]][w] += f;
    flow[w][p[w]] -= f;
  }
}
int mf() {
  int r = 0;
  while (bfs()) {
    aug(t, 0x3f3f3f3f);
    r += f;
  }
  return r;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int x;
  cin >> n >> m;
  t = 2 * n + 1;
  s = 0;
  for (int(i) = (0); (i) < (n); ++(i)) {
    res[in(i + 1)][out(i + 1)] = 0x3f3f3f3f;
  }
  for (int(i) = (0); (i) < (n); ++(i)) {
    cin >> x;
    res[s][in(i + 1)] = x;
    sr += x;
  }
  for (int(i) = (0); (i) < (n); ++(i)) {
    cin >> x;
    ss += x;
    res[out(i + 1)][t] = x;
  }
  while (m--) {
    int u, v;
    cin >> u >> v;
    res[in(u)][out(v)] = 0x3f3f3f3f;
    res[in(v)][out(u)] = 0x3f3f3f3f;
  }
  int r = mf();
  if (r != ss || ss != sr) {
    cout << "NO\n";
    return 0;
  }
  cout << "YES\n";
  for (int(i) = (0); (i) < (n); ++(i)) {
    for (int(j) = (0); (j) < (n); ++(j))
      cout << flow[in(i + 1)][out(j + 1)] << " \n"[j == n - 1];
  }
  return 0;
}
