#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
const int M = 1000;
struct ee {
  int to, cap, rev;
};
vector<vector<ee> > G;
vector<bool> v;
int A[101][101];
inline void add(int u, int v, int c) {
  G[u].push_back({v, c, 0});
  G[v].push_back({u, 0, 0});
  G[u].back().rev = G[v].size() - 1;
  G[v].back().rev = G[u].size() - 1;
}
int dfs(int src, int &sink, int flow = INF) {
  v[src] = 1;
  if (src == sink) return flow;
  int ret = 0;
  for (auto &e : G[src])
    if (!v[e.to] and e.cap > 0 and e.to != src) {
      ret = dfs(e.to, sink, min(flow, e.cap));
      if (ret > 0) {
        e.cap -= ret;
        G[e.to][e.rev].cap += ret;
        return ret;
      }
    }
  return 0;
}
int FF(int src, int sink) {
  int mf = 0, fl;
  while (1) {
    fill(v.begin(), v.end(), 0);
    fl = dfs(src, sink);
    if (fl == 0) break;
    mf += fl;
  }
  return mf;
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  int n, m, i, p, q, x, S, out, in;
  cin >> n >> m;
  for (i = 1; i <= n; i++) fill(A[i], A[i] + n + 1, 0);
  S = 2 * n + 1;
  G.resize(S + 1);
  v.resize(S + 1);
  for (i = 1, out = 0; i <= n; i++) {
    cin >> x;
    add(0, i, x);
    add(i, i + n, M);
    out += x;
  }
  for (i = 1, in = 0; i <= n; i++) {
    cin >> x;
    add(i + n, S, x);
    in += x;
  }
  while (m--) {
    cin >> p >> q;
    add(p, q + n, M);
    add(q, p + n, M);
  }
  x = FF(0, S);
  if (x == out and in == out) {
    cout << "YES" << endl;
    for (i = 1; i <= n; i++) {
      for (auto &e : G[i])
        if (e.to > n) {
          A[i][e.to - n] = M - e.cap;
        }
    }
    for (i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) cout << A[i][j] << ' ';
      cout << endl;
    }
  } else
    cout << "NO" << endl;
  return 0;
};
