#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
const int N = 205, inf = 1e9;
template <int SZ>
struct Dinic {
  int N = 0, s, t;
  typedef int F;
  struct Edge {
    int to, rev;
    F flow, cap;
    int id;
  };
  vector<Edge> adj[SZ];
  void addEdge(int u, int v, F cap, int id = 0) {
    N = max(N, max(u, v) + 1);
    Edge a = {v, (int)adj[v].size(), 0, cap, id},
         b = {u, (int)adj[u].size(), 0, 0, 0};
    adj[u].push_back(a), adj[v].push_back(b);
  }
  int lvl[SZ];
  typename vector<Edge>::iterator cur[SZ];
  bool bfs() {
    for (int i = 0; i < SZ; i++) {
      lvl[i] = -1;
      cur[i] = adj[i].begin();
    }
    queue<int> q({s});
    lvl[s] = 0;
    while (not q.empty()) {
      int u = q.front();
      q.pop();
      for (auto &e : adj[u])
        if (lvl[e.to] == -1 and e.flow < e.cap) {
          lvl[e.to] = lvl[u] + 1;
          q.push(e.to);
        }
    }
    return lvl[t] != -1;
  }
  F dfs(int u, F flow) {
    if (u == t or flow == 0) return flow;
    for (; cur[u] != adj[u].end(); cur[u]++) {
      Edge &e = *cur[u];
      if (lvl[e.to] != lvl[u] + 1 or e.flow == e.cap) continue;
      F df = dfs(e.to, min(flow, e.cap - e.flow));
      if (df) {
        e.flow += df;
        adj[e.to][e.rev].flow -= df;
        return df;
      }
    }
    return 0;
  }
  F maxFlow(int _s, int _t) {
    s = _s, t = _t;
    F totFlow = 0;
    while (bfs()) {
      while (F df = dfs(s, numeric_limits<F>::max())) {
        totFlow += df;
      }
    }
    return totFlow;
  }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  Dinic<N> Network;
  int s = 0, t = 2 * n + 1;
  int sa = 0, sb = 0;
  for (int i = 1, a; i <= n; i++) {
    cin >> a;
    sa += a;
    Network.addEdge(s, i, a);
    Network.addEdge(i, n + i, inf);
  }
  for (int i = 1, b; i <= n; i++) {
    cin >> b;
    sb += b;
    Network.addEdge(n + i, t, b);
  }
  for (int i = 1; i <= m; i++) {
    int x, y;
    cin >> x >> y;
    Network.addEdge(x, y + n, inf);
    Network.addEdge(y, x + n, inf);
  }
  int flow = Network.maxFlow(s, t);
  if (flow != sa or flow != sb) {
    return cout << "NO", 0;
  }
  cout << "YES"
       << "\n";
  int f[N][N] = {};
  for (int i = 1; i <= n; i++) {
    for (auto &e : Network.adj[i])
      if (e.to > n and e.to <= 2 * n) {
        f[i][e.to - n] = e.flow;
      }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cout << f[i][j] << " ";
    }
    cout << "\n";
  }
}
