#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int INF = 0x7f7f7f7f;
struct Node {
  int next, to, value;
} Map[maxn * 5];
int head[1010], sum;
int sta[200], last[200];
int n, m, maxflow, ALL;
int Start, End;
int dep[1010], gap[1010], ans[510][510];
void Init() {
  memset(Map, -1, sizeof(Map));
  memset(head, -1, sizeof(head));
  sum = 0;
  Start = 0;
  End = n * 2 + 1;
  ALL = 0;
  return;
}
void addedge(int u, int v, int w) {
  Map[sum].to = v;
  Map[sum].value = w;
  Map[sum].next = head[u];
  head[u] = sum++;
  Map[sum].to = u;
  Map[sum].value = 0;
  Map[sum].next = head[v];
  head[v] = sum++;
  return;
}
void bfs() {
  memset(dep, -1, sizeof(dep));
  memset(gap, 0, sizeof(gap));
  dep[End] = 0;
  gap[0] = 1;
  queue<int> q;
  q.push(End);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i != -1; i = Map[i].next) {
      int v = Map[i].to;
      if (dep[v] != -1) continue;
      q.push(v);
      dep[v] = dep[u] + 1;
      gap[dep[v]]++;
    }
  }
  return;
}
int dfs(int u, int flow) {
  if (u == End) {
    maxflow += flow;
    return flow;
  }
  int used = 0;
  for (int i = head[u]; i != -1; i = Map[i].next) {
    int v = Map[i].to;
    if (Map[i].value > 0 && dep[v] + 1 == dep[u]) {
      int meta = dfs(v, min(Map[i].value, flow - used));
      if (meta > 0) {
        Map[i].value -= meta;
        Map[i ^ 1].value += meta;
        ans[u][v] += meta;
        ans[v][u] -= meta;
        used += meta;
      }
      if (used == flow) return used;
    }
  }
  --gap[dep[u]];
  if (gap[dep[u]] == 0) dep[Start] = (n * 2 + 1) + 1;
  dep[u]++;
  gap[dep[u]]++;
  return used;
}
bool ISAP() {
  bfs();
  maxflow = 0;
  memset(ans, 0, sizeof(ans));
  while (dep[Start] < End) dfs(Start, INF);
  if (maxflow == ALL) return true;
  return false;
}
int main() {
  int u, v;
  cin >> n >> m;
  Init();
  for (int i = 1; i <= n; i++) scanf("%d", &sta[i]);
  for (int i = 1; i <= n; i++) scanf("%d", &last[i]);
  for (int i = 1; i <= n; i++) ALL += last[i];
  for (int i = 1; i <= n; i++) addedge(0, i, sta[i]);
  for (int i = 1; i <= n; i++) {
    int x, bin = 1;
    x = sta[i];
    addedge(i, i + n, x);
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &u, &v);
    int x, bin = 1;
    x = sta[u];
    addedge(u, v + n, x);
    x = sta[v];
    bin = 1;
    addedge(v, u + n, x);
  }
  for (int i = 1; i <= n; i++) addedge(i + n, n + n + 1, last[i]);
  bool flag = ISAP();
  if (flag == true) {
    cout << "YES" << endl;
    for (int i = 1; i <= n; i++) {
      for (int j = 1 + n; j <= n * 2; j++) cout << ans[i][j] << " ";
      cout << endl;
    }
  } else
    cout << "NO" << endl;
  return 0;
}
