// https://szkopul.edu.pl/problemset/problem/xCiDtZ0ZX70fyac1Sav8d37J/site/?key=statement
// Powódź
#include <bits/stdc++.h>
using namespace std;
constexpr int sizik = 500 * 1001, mod = 1'000'000'007;
#define int long long
#define ar std::array
#define pr std::pair
#define vec std::vector
typedef long long ll;
typedef vec<vec<int>> _kra;
typedef ar<int, 3> P;
int m, n, h;
int conv(int x, int y) {
return (y - 1) * n + x;
}
int rep[sizik];
int max_h[sizik];
int ways[sizik];
void init(int op) {
for (int i = 0; i <= op; i++) {
rep[i] = i;
max_h[i] = 0;
ways[i] = 1;
}
}
int Find(int a) {
if (rep[a] != a) rep[a] = Find(rep[a]);
return rep[a];
}
void Union(int a, int b, int value) {
a = Find(a), b = Find(b);
ways[b] = ((ways[a] + value - max_h[a]) * (ways[b] + value - max_h[b])) % mod;
max_h[b] = value;
rep[a] = b;
}
void solve() {
std::cin >> m >> n >> h;
std::vector<P> tamy;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n - 1; j++) {
int a;
std::cin >> a;
tamy.push_back({a, conv(j, i), conv(j + 1, i)});
}
}
for (int i = 1; i <= (m - 1); i++) {
for (int j = 1; j <= n; j++) {
int a;
std::cin >> a;
tamy.push_back({a, conv(j, i), conv(j, i + 1)});
}
}
std::sort(tamy.begin(), tamy.end(), [](const P& a, const P& b) { return a[0] < b[0]; });
init(n * m);
for (const auto& [a, b, c] : tamy) {
if (Find(b) == Find(c)) continue;
Union(b, c, a);
}
int r = Find(1);
int ans = (ways[rep[r]] + h - max_h[r]) % mod;
std::cout << ans << '\n';
}
int32_t main() {
std::ios_base::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);
int t = 1;
// std::cin >> t;
for (; t > 0; t--) {
solve();
}
return 0;
}