#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
const int N = 1e6 + 1;
int a, b, c, q, lx[N], rx[N], ly[N], ry[N], lz[N], rz[N], v[N];
ll f[N], h[N];
int p(int i, int j, int k) {
return max(0, ((i - 1) * b + (j - 1)) * c + ( k - 1 ) + 1);
}
void add(int x1, int x2, int y1, int y2, int z1, int z2, int w) {
f[p(x1, y1, z1)] += 1LL * w;
f[p(x2 + 1, y1, z1)] -= 1LL * w;
f[p(x1, y2 + 1, z1)] -= 1LL * w;
f[p(x2 + 1, y2 + 1, z1)] += 1LL * w;
f[p(x1, y1, z2 + 1)] -= 1LL * w;
f[p(x2 + 1, y1, z2 + 1)] += 1LL * w;
f[p(x1, y2 + 1, z2 + 1)] += 1LL * w;
f[p(x2 + 1, y2 + 1, z2 + 1)] -= 1LL * w;
}
void init() {
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
for (int k = 1; k <= c; k++) {
f[p(i, j, k)] = 0;
}
}
}
}
void sum() {
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
for (int k = 1; k <= c; k++) {
f[p(i, j, k)] += f[p(i - 1, j, k)];
}
}
}
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
for (int k = 1; k <= c; k++) {
f[p(i, j, k)] += f[p(i, j - 1, k)];
}
}
}
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
for (int k = 1; k <= c; k++) {
f[p(i, j, k)] += f[p(i, j, k - 1)];
}
}
}
}
bool check(int m) {
init();
for (int i = 1; i <= m; i++) {
add(lx[i], rx[i], ly[i], ry[i], lz[i], rz[i], v[i]);
}
sum();
int flag = 0;
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
for (int k = 1; k <= c; k++) {
flag |= f[p(i, j, k)] > h[p(i, j, k)];
}
}
}
return flag;
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> a >> b >> c >> q;
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
for (int k = 1; k <= c; k++) {
cin >> h[p(i, j, k)];
}
}
}
for (int i = 1; i <= q; i++) {
cin >> lx[i] >> rx[i] >> ly[i] >> ry[i] >> lz[i] >> rz[i] >> v[i];
}
int l = 1, r = q, res = 1145141919;
while (l <= r) {
int m = l + r >> 1;
if (check(m)) r = m - 1, res = m;
else l = m + 1;
}
cout << (res == 1145141919 ? -1 : res);
return 0;
}