#include <bits/stdc++.h>
using namespace std;
struct Dinic {
  struct edge {
    int to, cap, rev;
  };
  int n;
  vector<vector<edge>> G;
  vector<int> level;
  vector<int> iter;
  void bfs(int s) {
    level.assign(n, -1);
    queue<int> que;
    que.push(s);
    level[s] = 0;
    while (que.size()) {
      int v = que.front();
      que.pop();
      for (int i = 0; i < G[v].size(); i++) {
        edge &e = G[v][i];
        if (e.cap > 0 && level[e.to] < 0) {
          level[e.to] = level[v] + 1;
          que.push(e.to);
        }
      }
    }
  }
  int dfs(int v, int t, int f) {
    if (v == t) return f;
    for (int i = iter[v]; i < G[v].size(); i++) {
      edge &e = G[v][i];
      if (e.cap > 0 && level[v] < level[e.to]) {
        int d = dfs(e.to, t, min(f, e.cap));
        if (d > 0) {
          e.cap -= d;
          G[e.to][e.rev].cap += d;
          return d;
        }
      }
    }
    return 0;
  }
  Dinic(int n) : n(n), G(n), level(n), iter(n) {}
  void add_edge(int from, int to, int cap) {
    G[from].push_back({to, cap, int(G[to].size())});
    G[to].push_back({from, 0, int(G[from].size()) - 1});
  }
  int max_flow(int s, int t) {
    int flow = 0;
    while (1) {
      bfs(s);
      if (level[t] < 0) return flow;
      iter.assign(n, 0);
      int f;
      while ((f = dfs(s, t, 1e9)) > 0) {
        flow += f;
      }
    }
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<int> as(n), bs(n);
  for (int i = 0; i < n; i++) cin >> as[i];
  for (int i = 0; i < n; i++) cin >> bs[i];
  Dinic dinic(2 * n + 2);
  for (int i = 0; i < n; i++) {
    dinic.add_edge(2 * n, i, as[i]);
  }
  for (int i = 0; i < n; i++) {
    dinic.add_edge(n + i, 2 * n + 1, bs[i]);
    dinic.add_edge(i, n + i, 1e6);
  }
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    dinic.add_edge(a, n + b, 1e6);
    dinic.add_edge(b, n + a, 1e6);
  }
  int F = accumulate(as.begin(), as.end(), 0);
  if (F != accumulate(bs.begin(), bs.end(), 0)) {
    cout << "NO" << endl;
    return 0;
  }
  int f = dinic.max_flow(2 * n, 2 * n + 1);
  if (f != F) {
    cout << "NO" << endl;
    return 0;
  }
  cout << "YES" << endl;
  vector<vector<int>> ans(n, vector<int>(n));
  for (int i = 0; i < n + 2; i++) {
    for (auto &a : dinic.G[i]) {
      if (0 <= i && i < n && n <= a.to && a.to < 2 * n) {
        ans[i][a.to - n] = 1e6 - a.cap;
      }
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cout << ans[i][j] << ' ';
    }
    cout << endl;
  }
}
