#include <bits/stdc++.h>
using namespace std;
const int inf = 0x0f0f0f0f;
template <class S, class T>
inline pair<S, T> MP(S a, T b) {
  return make_pair(a, b);
}
template <class T>
inline auto LX(T &X) -> decltype((X.first)) {
  return X.first;
}
template <class T>
inline auto LX(const T &X) -> const decltype((X.first)) {
  return X.first;
}
template <class T>
inline auto RX(T &X) -> decltype((X.second)) {
  return X.second;
}
template <class T>
inline auto RX(const T &X) -> const decltype((X.second)) {
  return X.second;
}
template <class T>
inline void RST(T &a) {
  memset(a, 0, sizeof(a));
}
template <class T>
inline void RST1(T &a) {
  memset(a, -1, sizeof(a));
}
template <class T>
inline void SINF(T &a) {
  memset(a, 0x0f, sizeof(a));
}
template <class S, class T>
inline void RST(S &a, T b) {
  fill((T *)a, (T *)a + (sizeof(a) / sizeof(b)), b);
}
template <class T>
inline void CLR(T &a) {
  a.clear();
}
template <class S, class T>
inline void CPY(S &a, T &b) {
  memcpy(a, b, sizeof(a));
}
template <class S, class T>
inline bool chkmin(S &a, T b) {
  return b < a ? a = b, 1 : 0;
}
template <class S, class T>
inline bool chkmax(S &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class T>
inline int SZ(T &a) {
  return (int)(a.size());
}
template <class T>
inline bool EPT(T &a) {
  return a.empty();
}
template <class T>
inline auto FRT(T &a) -> decltype((a.front())) {
  return a.front();
}
template <class T>
inline auto FRT(const T &a) -> const decltype((a.front())) {
  return a.front();
}
template <class T>
inline auto BK(T &a) -> decltype(a.back()) & {
  return a.back();
}
template <class T>
inline auto BK(const T &a) -> const decltype((a.back())) {
  return a.back();
}
template <class T>
inline auto TOP(T &a) -> decltype((a.top())) {
  return a.top();
}
template <class T>
inline auto TOP(const T &a) -> const decltype((a.top())) {
  return a.top();
}
int n, m, nn, k;
int a[310][310], b[310][310];
int r[200010], cr[200010], sz[200010];
vector<pair<int, int> > l[200010];
unordered_map<int, int> c;
int find(int x) { return x == r[x] ? x : r[x] = find(r[x]); }
int d[1010][1010];
deque<pair<int, int> > Q;
int ox, oy;
bool cmp(const pair<int, int> &a, const pair<int, int> &b) {
  return d[LX(a) - ox + k][RX(a) - oy + k] < d[LX(b) - ox + k][RX(b) - oy + k];
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      int &x = a[i][j];
      scanf("%d", &x);
      if (x)
        if (!c.count(x))
          x = c[x] = ++nn;
        else
          x = c[x];
      sz[x]++;
    }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      int &x = b[i][j];
      scanf("%d", &x);
      if (x != -1) {
        if (x)
          if (!c.count(x))
            x = c[x] = ++nn;
          else
            x = c[x];
        l[a[i][j]].push_back(MP(i, j));
      }
    }
  for (int i = 0; i <= nn; i++) r[i] = cr[i] = i;
  k = max(n, m);
  int x = k, y = k, t = 0;
  for (int i = 1; i < k; i++) {
    d[--x][y] = ++t;
    for (int j = 1; j < 2 * i; j++) d[x][++y] = ++t;
    for (int j = 0; j < 2 * i; j++) d[++x][y] = ++t;
    for (int j = 0; j < 2 * i; j++) d[x][--y] = ++t;
    for (int j = 0; j < 2 * i; j++) d[--x][y] = ++t;
  }
  scanf("%d%d", &x, &y);
  Q.push_back(MP(x, y));
  long long ans = 0;
  while (!EPT(Q)) {
    int x = LX(FRT(Q)), y = RX(FRT(Q));
    Q.pop_front();
    int c1 = find(a[x][y]), c2 = find(b[x][y]);
    if (!cr[c1] || cr[c1] == b[x][y]) continue;
    ox = x, oy = y;
    sort(l[c1].begin(), l[c1].end(), cmp);
    for (pair<int, int> t : l[c1]) Q.push_back(t);
    CLR(l[c1]);
    ans += sz[c1];
    if (c1 != c2) sz[c2] += sz[c1], r[c1] = c2;
    cr[c2] = b[x][y];
  }
  printf("%I64d\n", ans);
  return 0;
}
