#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int M = 1e5 + 5;
struct edge {
  int from, to, cap, flow, index;
  edge(int from, int to, int cap, int flow, int index)
      : from(from), to(to), cap(cap), flow(flow), index(index) {}
};
struct PushRelabel {
  static const long long INF = 1e18;
  int n;
  vector<vector<edge> > g;
  vector<long long> excess;
  vector<int> height;
  PushRelabel(int n) : n(n), g(n), excess(n), height(n) {}
  void addEdge(int from, int to, int cap) {
    g[from].push_back(edge(from, to, cap, 0, g[to].size()));
    if (from == to) g[from].back().index++;
    g[to].push_back(edge(to, from, 0, 0, g[from].size() - 1));
  }
  void push(edge &e) {
    int amt = (int)min(excess[e.from], (long long)e.cap - e.flow);
    if (height[e.from] <= height[e.to] || amt == 0) return;
    e.flow += amt;
    g[e.to][e.index].flow -= amt;
    excess[e.to] += amt;
    excess[e.from] -= amt;
  }
  void relabel(int u) {
    int d = 2e5;
    for (auto &it : g[u]) {
      if (it.cap - it.flow > 0) d = min(d, height[it.to]);
    }
    if (d < INF) height[u] = d + 1;
  }
  vector<int> find_max_height_vertices(int source, int dest) {
    vector<int> max_height;
    for (int i = 0; i < n; i++) {
      if (i != source && i != dest && excess[i] > 0) {
        if (!max_height.empty() && height[i] > height[max_height[0]])
          max_height.clear();
        if (max_height.empty() || height[i] == height[max_height[0]])
          max_height.push_back(i);
      }
    }
    return max_height;
  }
  long long max_flow(int source, int dest) {
    excess.assign(n, 0);
    height.assign(n, 0);
    height[source] = n;
    excess[source] = INF;
    for (auto &it : g[source]) push(it);
    vector<int> current;
    while (!(current = find_max_height_vertices(source, dest)).empty()) {
      for (auto i : current) {
        bool pushed = false;
        for (auto &e : g[i]) {
          if (excess[i] == 0) break;
          if (e.cap - e.flow > 0 && height[e.from] == height[e.to] + 1) {
            push(e);
            pushed = true;
          }
        }
        if (!pushed) {
          relabel(i);
          break;
        }
      }
    }
    long long max_flow = 0;
    for (auto &e : g[source]) max_flow += e.flow;
    return max_flow;
  }
};
PushRelabel flow(300);
int n, m, a[105], b[105];
int sa = 0, sb = 0;
int main() {
  ios_base::sync_with_stdio(false);
  int i, j;
  cin >> n >> m;
  for (i = 1; i <= n; i++) {
    cin >> a[i];
    sa += a[i];
  }
  for (i = 1; i <= n; i++) {
    cin >> b[i];
    sb += b[i];
  }
  for (i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    flow.addEdge(a, n + b, 1000000007);
    flow.addEdge(b, n + a, 1000000007);
  }
  for (i = 1; i <= n; i++) {
    flow.addEdge(i, i + n, 1000000007);
    flow.addEdge(0, i, a[i]);
    flow.addEdge(i + n, 2 * n + 1, b[i]);
  }
  int mat[105][105];
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
      mat[i][j] = 0;
    }
  }
  if (sa == sb && sa == flow.max_flow(0, 2 * n + 1)) {
    cout << "YES\n";
    for (i = 1; i <= n; i++) {
      for (j = 0; j < flow.g[i].size(); j++) {
        int y = flow.g[i][j].to;
        int f = flow.g[i][j].flow;
        if (i < y) mat[i][y - n] = f;
      }
    }
    for (i = 1; i <= n; i++) {
      for (j = 1; j <= n; j++) {
        cout << mat[i][j] << " ";
      }
      cout << endl;
    }
  } else {
    cout << "NO\n";
  }
  return 0;
}
