#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
typedef long long ll;
const int MAXN = 2005;
const ll INF = (1LL << 63);
ll A[MAXN], B[MAXN];
ll a[MAXN * MAXN];
int p[MAXN * MAXN], q[MAXN * MAXN];
int n, m;
bool check() {
for (int i = 1; i <= n; ++i) {
ll rowSum = 0;
for (int j = 1; j <= n; ++j) {
rowSum += a[(i - 1) * n + j];
}
if (rowSum != A[i]) return false;
}
for (int j = 1; j <= n; ++j) {
ll colSum = 0;
for (int i = 1; i <= n; ++i) {
colSum += a[(i - 1) * n + j];
}
if (colSum != B[j]) return false;
}
for (int i = 0; i < m; ++i) {
if (a[p[i]] != q[i]) return false;
}
return true;
}
bool solve() {
memset(a, 0, sizeof(a));
for (int i = 0; i < m; ++i) {
a[p[i]] = q[i];
}
for (int i = 1; i <= n; ++i) {
ll rowSum = 0;
for (int j = 1; j <= n; ++j) {
rowSum += a[(i - 1) * n + j];
}
int firstFree = -1;
for (int j = 1; j <= n; ++j) {
int idx = (i - 1) * n + j;
bool isRestricted = false;
for (int k = 0; k < m; ++k) {
if (p[k] == idx) {
isRestricted = true;
break;
}
}
if (!isRestricted) {
if (firstFree == -1) firstFree = idx;
}
}
if (firstFree != -1) {
a[firstFree] += A[i] - rowSum;
} else {
if (rowSum != A[i]) return false;
}
}
for (int j = 1; j <= n; ++j) {
ll colSum = 0;
for (int i = 1; i <= n; ++i) {
colSum += a[(i - 1) * n + j];
}
int firstFree = -1;
for (int i = 1; i <= n; ++i) {
int idx = (i - 1) * n + j;
bool isRestricted = false;
for (int k = 0; k < m; ++k) {
if (p[k] == idx) {
isRestricted = true;
break;
}
}
if (!isRestricted) {
if (firstFree == -1) firstFree = idx;
}
}
if (firstFree != -1) {
a[firstFree] += B[j] - colSum;
} else {
if (colSum != B[j]) return false;
}
}
return check();
}
int main() {
int T;
cin >> T;
while (T--) {
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> A[i];
}
for (int i = 1; i <= n; ++i) {
cin >> B[i];
}
for (int i = 0; i < m; ++i) {
cin >> p[i] >> q[i];
}
if (solve()) {
cout << "OK" << endl;
for (int i = 1; i <= n * n; ++i) {
cout << a[i];
if (i < n * n) cout << " ";
}
cout << endl;
} else {
cout << "No Solution" << endl;
}
}
return 0;
}