#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 2000;
struct Edge {
  int to, nxt, flow, cap;
} edge[MAXN];
int nedg;
int head[MAXN];
int st, ed;
int vis[MAXN], d[MAXN], mp[MAXN][MAXN], cur[MAXN];
int n, sum, presum, m;
queue<int> q;
void init() {
  presum = 0;
  sum = 0;
  nedg = 0;
  memset(head, -1, sizeof(head));
}
void addedge(int u, int v, int w, int rw = 0) {
  edge[nedg].to = v;
  edge[nedg].cap = w;
  edge[nedg].flow = 0;
  edge[nedg].nxt = head[u];
  head[u] = nedg++;
  edge[nedg].to = u;
  edge[nedg].cap = rw;
  edge[nedg].flow = 0;
  edge[nedg].nxt = head[v];
  head[v] = nedg++;
}
bool bfs() {
  memset(vis, 0, sizeof(vis));
  q.push(st);
  d[st] = 0;
  vis[st] = 1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i != -1; i = edge[i].nxt) {
      Edge &temp = edge[i];
      if (!vis[temp.to] && temp.cap > temp.flow) {
        vis[temp.to] = 1;
        d[temp.to] = d[u] + 1;
        q.push(temp.to);
      }
    }
  }
  return vis[ed];
}
int dfs(int u, int a) {
  if (u == ed || a <= 0) return a;
  int flow = 0, f;
  for (int &i = cur[u]; i != -1; i = edge[i].nxt) {
    Edge &temp = edge[i];
    if (d[u] + 1 == d[temp.to] &&
        (f = dfs(temp.to, min(a, temp.cap - temp.flow))) > 0) {
      temp.flow += f;
      edge[i ^ 1].flow -= f;
      flow += f;
      a -= f;
      if (a == 0) break;
    }
  }
  return flow;
}
int Dinic() {
  int flow = 0;
  while (bfs()) {
    memcpy(cur, head, sizeof(head));
    flow += dfs(st, INF);
  }
  return flow;
}
int main() {
  init();
  int in, in2;
  cin >> n >> m;
  st = 0;
  ed = n * 2 + 1;
  for (int i = 1; i <= n; i++) {
    cin >> in;
    presum += in;
    addedge(0, i, in);
    addedge(i, n + i, INF);
  }
  for (int i = 1; i <= n; i++) {
    cin >> in;
    sum += in;
    addedge(n + i, ed, in);
  }
  for (int i = 1; i <= m; i++) {
    cin >> in >> in2;
    addedge(in, in2 + n, INF);
    addedge(in2, in + n, INF);
  }
  if (sum != presum || Dinic() != sum) {
    puts("NO");
    return 0;
  }
  puts("YES");
  for (int i = 1; i <= n; i++) {
    for (int j = head[i]; j != -1; j = edge[j].nxt) {
      struct Edge temp = edge[j];
      if (temp.flow > 0) mp[i][temp.to - n] = temp.flow;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) printf("%d ", mp[i][j]);
    printf("\n");
  }
  return 0;
}
