#include <bits/stdc++.h>
using namespace std;
struct edge {
  int to, cap, rev;
  edge(int _to, int _cap, int _rev) : to(_to), cap(_cap), rev(_rev) {}
};
int ini[510], desired[510], n, shift = 150, ans[510][510];
struct dinic {
  vector<edge> graph[510];
  int level[510], iter[510];
  dinic() {
    fill(level, level + 510, 0);
    fill(iter, iter + 510, 0);
  }
  void add(int from, int to, int cap) {
    graph[from].push_back(edge(to, cap, graph[to].size()));
    graph[to].push_back(edge(from, 0, graph[from].size() - 1));
  }
  void bfs(int s) {
    memset(level, -1, sizeof level);
    queue<int> q;
    level[s] = 0;
    q.push(s);
    while (!q.empty()) {
      int actual = q.front();
      q.pop();
      for (int i = 0; i < graph[actual].size(); i++) {
        edge &e = graph[actual][i];
        if (e.cap > 0 && level[e.to] < 0) {
          level[e.to] = level[actual] + 1;
          q.push(e.to);
        }
      }
    }
  }
  int dfs(int v, int t, int f) {
    if (v == t) return f;
    for (int &i = iter[v]; i < graph[v].size(); i++) {
      edge &e = graph[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;
          graph[e.to][e.rev].cap += d;
          return d;
        }
      }
    }
    return 0;
  }
  int flow(int start, int to) {
    int ans = 0;
    while (true) {
      bfs(start);
      if (level[to] < 0) return ans;
      int f;
      memset(iter, 0, sizeof iter);
      while ((f = dfs(start, to, 1e9)) > 0) ans += f;
    }
  }
  void printAns() {
    for (int i = 1 + shift; i <= n + shift; i++) {
      for (int j = 0; j < ((int)graph[i].size()); j++) {
        ans[graph[i][j].to][i - shift] += graph[i][j].cap;
      }
    }
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if (j != 1) printf(" ");
        printf("%d", ans[i][j]);
      }
      printf("\n");
    }
  }
} diniczao;
int main() {
  int m, n1, n2, source, sink, sum = 0, eta = 0;
  scanf("%d %d", &n, &m);
  source = 0;
  sink = 510 - 1;
  for (int i = 1; i <= n; i++)
    scanf("%d", &ini[i]), diniczao.add(source, i, ini[i]), sum += ini[i];
  for (int i = 1; i <= n; i++)
    scanf("%d", &desired[i]), eta += desired[i],
        diniczao.add(i, i + shift, ini[i]),
        diniczao.add(i + shift, sink, desired[i]);
  for (int i = 0; i < m; i++) {
    scanf("%d %d", &n1, &n2);
    diniczao.add(n1, n2 + shift, ini[n1]);
    diniczao.add(n2, n1 + shift, ini[n2]);
  }
  int maxf = diniczao.flow(source, sink);
  if (maxf == sum and maxf == eta) {
    printf("YES\n");
    diniczao.printAns();
  } else
    printf("NO\n");
  return 0;
}
