#include <bits/stdc++.h>
using namespace std;
const long double epsilon = 1e-9;
int distance(int x, int y, int cx, int cy) {
  swap(x, y);
  swap(cx, cy);
  int maxm = max(abs(x - cx), abs(y - cy));
  int n = maxm * 2 + 1;
  int diffx = x - cx, diffy = y - cy;
  if (diffx == -maxm && diffy == -maxm) return n * n;
  if (diffy == -maxm) return (n - 1) * (n - 2) + 1 - (cx + maxm - x);
  if (diffx == maxm) return (n - 1) * (n - 1) + 1 - (cy + maxm - y);
  if (diffy == maxm) return n * (n - 1) + 1 - (x - cx + maxm);
  return n * n - (y - cy + maxm);
}
int mat[512][512];
struct symbol {
  int color;
  int x, y;
};
int main() {
  int n, m;
  cin >> n >> m;
  map<int, int> colorCount;
  map<int, vector<int> > colorSymbols;
  map<int, int> currentColor;
  map<pair<int, int>, int> symbolIdxs;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> mat[i][j];
      colorCount[mat[i][j]]++;
      currentColor[mat[i][j]] = mat[i][j];
    }
  }
  int tmp;
  vector<symbol> symbols;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> tmp;
      if (tmp != -1) {
        symbol temp;
        temp.x = i;
        temp.y = j;
        temp.color = tmp;
        colorSymbols[mat[i][j]].push_back((int)symbols.size());
        symbolIdxs.insert(make_pair(make_pair(i, j), (int)symbols.size()));
        symbols.push_back(temp);
      }
    }
  }
  int x, y;
  cin >> x >> y;
  x--;
  y--;
  queue<int> toProcess;
  toProcess.push(symbolIdxs[make_pair(x, y)]);
  long long res = 0;
  int cur;
  int curColor;
  int t;
  while (!toProcess.empty()) {
    cur = toProcess.front();
    toProcess.pop();
    curColor = currentColor[mat[symbols[cur].x][symbols[cur].y]];
    vector<int> toFix;
    while ((t = currentColor[curColor]) != curColor) {
      toFix.push_back(curColor);
      curColor = t;
    }
    for (int i = 0; i < toFix.size(); i++) currentColor[toFix[i]] = curColor;
    if (curColor == 0 || curColor == symbols[cur].color) continue;
    map<int, vector<int> >::iterator itr = colorSymbols.find(curColor);
    if (itr != colorSymbols.end()) {
      vector<pair<int, int> > v;
      for (int i = 0; i < itr->second.size(); i++) {
        v.push_back(make_pair(
            distance(symbols[itr->second[i]].x, symbols[itr->second[i]].y,
                     symbols[cur].x, symbols[cur].y),
            itr->second[i]));
      }
      sort(v.begin(), v.end());
      for (int i = 0; i < v.size(); i++) {
        if (v[i].first == 1) continue;
        toProcess.push(v[i].second);
      }
      itr->second.clear();
    }
    tmp = colorCount[curColor];
    colorCount[symbols[cur].color] += tmp;
    res += (long long)tmp;
    colorCount.erase(curColor);
    currentColor[curColor] = symbols[cur].color;
    currentColor[symbols[cur].color] = symbols[cur].color;
  }
  cout << res << endl;
  return 0;
}
