#include <bits/stdc++.h>
using namespace std;
const int N = 2000;
int tab[N][N][4];
int n, m;
pair<int, int> kra[11][4];
int odl[11][11];
int seq[10005];
void przejdz(int t, int k) {
  for (int r = 0; r < n + m; r++) {
    for (int i = 0; i <= r && i < n; i++) {
      if (r - i < m) {
        if (kra[tab[i][r - i][t]][t].first == -1)
          kra[tab[i][r - i][t]][t] = make_pair(i, r - i);
      }
    }
  }
}
int main() {
  int k, s, a, b;
  scanf("%d%d%d%d", &n, &m, &k, &s);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      scanf("%d", &tab[i][j][0]);
      tab[j][n - 1 - i][1] = tab[i][j][0];
      tab[n - 1 - i][m - 1 - j][2] = tab[i][j][0];
      tab[m - 1 - j][i][3] = tab[i][j][0];
    }
  }
  for (int i = 1; i <= k; i++)
    for (int j = 0; j < 4; j++) kra[i][j] = make_pair(-1, -1);
  for (int j = 0; j < 4; j++) {
    przejdz(j, k);
    swap(n, m);
  }
  for (int i = 1; i <= k; i++) {
    swap(kra[i][1].first, kra[i][1].second);
    kra[i][1].first = n - 1 - kra[i][1].first;
    kra[i][2].first = n - 1 - kra[i][2].first;
    kra[i][2].second = m - 1 - kra[i][2].second;
    swap(kra[i][3].first, kra[i][3].second);
    kra[i][3].second = m - 1 - kra[i][3].second;
  }
  for (int a = 1; a <= k; a++)
    for (int b = 1; b <= k; b++)
      for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++)
          odl[a][b] =
              max(odl[a][b], abs(kra[a][i].first - kra[b][j].first) +
                                 abs(kra[a][i].second - kra[b][j].second));
  scanf("%d", &seq[0]);
  int MAX = 0;
  for (int t = 1; t < s; t++) {
    scanf("%d", &seq[t]);
    MAX = max(MAX, odl[seq[t - 1]][seq[t]]);
  }
  printf("%d\n", MAX);
  return 0;
}
