#include <bits/stdc++.h>   using namespace std;   int adj[205][205];   int rgraph[205][205];   int n, m;   int parent[205];   bool visited[205];   int a[105];   int b[105];   bool bfs(int s, int t) {     memset(visited, 0, sizeof(visited));     queue<int> q;     q.push(s);     visited[s] = true;     parent[s] = -1;     while (!q.empty()) {       int u = q.front();       q.pop();       for (int i = 0; i <= 2 * n + 1; i++) {         if (!visited[i] && rgraph[u][i] > 0) {           q.push(i);           parent[i] = u;           visited[i] = true;         }       }     }     return visited[t] == true;   }   int solve(int s, int t) {     for (int i = 0; i <= 2 * n + 1; i++) {       for (int j = 0; j <= 2 * n + 1; j++) {         rgraph[i][j] = adj[i][j];       }     }     int max_flow = 0;     while (bfs(0, 2 * n + 1)) {       int path = 2000000000;       for (int i = t; i != s; i = parent[i]) {         int u = parent[i];         path = min(path, rgraph[u][i]);       }       for (int i = t; i != s; i = parent[i]) {         int u = parent[i];         rgraph[u][i] -= path;         rgraph[i][u] += path;       }       max_flow += path;     }     return max_flow;   }   int main() {     cin >> n >> m;     int suma = 0, sumb = 0;     for (int i = 1; i <= n; i++) {       cin >> a[i];       adj[0][i] = a[i];       suma += a[i];     }     for (int i = 1; i <= n; i++) {       cin >> b[i];       adj[n + i][2 * n + 1] = b[i];       sumb += b[i];       adj[i][n + i] = 1000000;     }     for (int i = 0; i < m; i++) {       int c, d;       cin >> c >> d;       adj[c][n + d] = 1000000;       adj[d][n + c] = 1000000;     }     int ans = solve(0, 2 * n + 1);     if (ans == suma && ans == sumb) {       printf( YES n );       for (int i = 1; i <= n; i++) {         for (int j = 1; j <= n; j++) {           if (rgraph[i][n + j] != 0)             printf( %d  , 1000000 - rgraph[i][n + j]);           else             printf( %d  , rgraph[i][n + j]);         }         printf(  n );       }     } else {       printf( NO n );     }   }   