OI XXV - pow

// 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;
}