#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
const int dre_4[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
const int dre_8[8][2] = {{1, 0},  {1, 1},   {0, 1},  {-1, 1},
                         {-1, 0}, {-1, -1}, {0, -1}, {1, -1}};
const int kaijou[10] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
vector<pair<int, int> > ans;
int s[32][32], g[32][32];
void ope(int x0, int y0, int x1, int y1) {
  swap(s[x0][y0], s[x1][y1]);
  ans.push_back(pair<int, int>(x1, y1));
}
void start(int x, int y) {
  ans.push_back(pair<int, int>(x, y));
  for (int i = y; i > 1; i--) ope(x, i, x, i - 1);
  for (int i = x; i > 1; i--) ope(i, 1, i - 1, 1);
}
void row(int x, int y, int z) {
  if (y == z) return;
  if (x != 1) {
    if (y < z) {
      for (int i = 1; i <= x - 2; i++) ope(i, 1, i + 1, 1);
      for (int i = 1; i <= y - 1; i++) ope(x - 1, i, x - 1, i + 1);
      for (int i = y; i < z; i++) {
        ope(x - 1, i, x, i);
        ope(x, i, x, i + 1);
        ope(x, i + 1, x - 1, i);
        ope(x - 1, i, x - 1, i + 1);
      }
      for (int i = z; i > 1; i--) {
        ope(x - 1, i, x - 1, i - 1);
      }
      for (int i = x - 1; i > 1; i--) {
        ope(i, 1, i - 1, 1);
      }
    } else {
      for (int i = 1; i <= x - 2; i++) ope(i, 1, i + 1, 1);
      for (int i = 1; i <= y - 1; i++) ope(x - 1, i, x - 1, i + 1);
      for (int i = y; i > z; i--) {
        ope(x - 1, i, x, i);
        ope(x, i, x, i - 1);
        ope(x, i - 1, x - 1, i);
        ope(x - 1, i, x - 1, i - 1);
      }
      for (int i = z; i > 1; i--) {
        ope(x - 1, i, x - 1, i - 1);
      }
      for (int i = x - 1; i > 1; i--) {
        ope(i, 1, i - 1, 1);
      }
    }
  } else {
    if (y < z) {
      ope(1, 1, 2, 1);
      for (int i = 1; i <= y - 1; i++) ope(2, i, 2, i + 1);
      for (int i = y; i < z; i++) {
        ope(2, i, 1, i);
        ope(1, i, 1, i + 1);
        ope(1, i + 1, 2, i);
        ope(2, i, 2, i + 1);
      }
      for (int i = z; i > 1; i--) {
        ope(2, i, 2, i - 1);
      }
      ope(2, 1, 1, 1);
    } else {
      ope(1, 1, 2, 1);
      for (int i = 1; i <= y - 1; i++) ope(2, i, 2, i + 1);
      for (int i = y; i > z; i--) {
        ope(2, i, 1, i);
        ope(1, i, 1, i - 1);
        ope(1, i - 1, 2, i);
        ope(2, i, 2, i - 1);
      }
      for (int i = z; i > 1; i--) {
        ope(2, i, 2, i - 1);
      }
      ope(2, 1, 1, 1);
    }
  }
}
void col(int x, int y, int z) {
  if (x == y) return;
  if (z != 1) {
    if (x < y) {
      for (int i = 1; i <= z - 2; i++) ope(1, i, 1, i + 1);
      for (int i = 1; i <= x - 1; i++) ope(i, z - 1, i + 1, z - 1);
      for (int i = x; i < y; i++) {
        ope(i, z - 1, i, z);
        ope(i, z, i + 1, z);
        ope(i + 1, z, i, z - 1);
        ope(i, z - 1, i + 1, z - 1);
      }
      for (int i = y; i > 1; i--) {
        ope(i, z - 1, i - 1, z - 1);
      }
      for (int i = z - 1; i > 1; i--) {
        ope(1, i, 1, i - 1);
      }
    } else {
      for (int i = 1; i <= z - 2; i++) ope(1, i, 1, i + 1);
      for (int i = 1; i <= x - 1; i++) ope(i, z - 1, i + 1, z - 1);
      for (int i = x; i > y; i--) {
        ope(i, z - 1, i, z);
        ope(i, z, i - 1, z);
        ope(i - 1, z, i, z - 1);
        ope(i, z - 1, i - 1, z - 1);
      }
      for (int i = y; i > 1; i--) {
        ope(i, z - 1, i - 1, z - 1);
      }
      for (int i = z - 1; i > 1; i--) {
        ope(1, i, 1, i - 1);
      }
    }
  } else {
    if (x < y) {
      ope(1, 1, 1, 2);
      for (int i = 1; i <= x - 1; i++) ope(i, 2, i + 1, 2);
      for (int i = x; i < y; i++) {
        ope(i, 2, i, 1);
        ope(i, 1, i + 1, 1);
        ope(i + 1, 1, i, 2);
        ope(i, 2, i + 1, 2);
      }
      for (int i = y; i > 1; i--) {
        ope(i, 2, i - 1, 2);
      }
      ope(1, 2, 1, 1);
    } else {
      ope(1, 1, 1, 2);
      for (int i = 1; i <= x - 1; i++) ope(i, 2, i + 1, 2);
      for (int i = x; i > y; i--) {
        ope(i, 2, i, 1);
        ope(i, 1, i - 1, 1);
        ope(i - 1, 1, i, 2);
        ope(i, 2, i - 1, 2);
      }
      for (int i = y; i > 1; i--) {
        ope(i, 2, i - 1, 2);
      }
      ope(1, 2, 1, 1);
    }
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) scanf("%d", &s[i][j]);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) scanf("%d", &g[i][j]);
  if (n >= 2 && m >= 2) {
    int x, y;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++)
        if (s[i][j] == g[1][1]) {
          x = i;
          y = j;
        }
    start(x, y);
    for (int x0 = 1; x0 <= n; x0++)
      for (int y0 = 1; y0 <= m; y0++) {
        if (x0 + y0 > 2) {
          x = -1;
          y = -1;
          int i = x0, j = y0;
          for (; i <= n; i++) {
            for (; j <= m; j++) {
              if (s[i][j] == g[x0][y0]) {
                x = i;
                y = j;
              }
            }
            j = 1;
          }
          if (x == -1) {
            cout << -1 << endl;
            return 0;
          }
          row(x, y, y0);
          col(x, x0, y0);
        }
      }
    printf("%d\n", ans.size() - 1);
    for (int i = 0; i < ans.size(); i++) {
      printf("%d %d\n", ans[i].first, ans[i].second);
    }
    return 0;
  } else if (n == 1) {
    for (int i = 1; i <= m; i++) {
      for (int j = 1; j <= m; j++) {
        if (i < j) {
          ans.push_back(pair<int, int>(1, i));
          for (int k = i; k < j; k++) {
            ope(1, k, 1, k + 1);
          }
          bool t = true;
          for (int k = 1; k <= m; k++) {
            if (s[1][k] != g[1][k]) t = false;
          }
          if (t) {
            printf("%d\n", ans.size() - 1);
            for (int i = 0; i < ans.size(); i++) {
              printf("%d %d\n", ans[i].first, ans[i].second);
            }
            return 0;
          }
          for (int k = j; k > i; k--) {
            ope(1, k, 1, k - 1);
          }
          ans.clear();
        }
        if (i > j) {
          ans.push_back(pair<int, int>(1, i));
          for (int k = i; k > j; k--) {
            ope(1, k, 1, k - 1);
          }
          bool t = true;
          for (int k = 1; k <= m; k++) {
            if (s[1][k] != g[1][k]) t = false;
          }
          if (t) {
            printf("%d\n", ans.size() - 1);
            for (int i = 0; i < ans.size(); i++) {
              printf("%d %d\n", ans[i].first, ans[i].second);
            }
            return 0;
          }
          for (int k = j; k < i; k++) {
            ope(1, k, 1, k + 1);
          }
          ans.clear();
        }
      }
    }
    cout << -1 << endl;
  } else if (m == 1) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if (i < j) {
          ans.push_back(pair<int, int>(i, 1));
          for (int k = i; k < j; k++) {
            ope(k, 1, k + 1, 1);
          }
          bool t = true;
          for (int k = 1; k <= n; k++) {
            if (s[k][1] != g[k][1]) t = false;
          }
          if (t) {
            printf("%d\n", ans.size() - 1);
            for (int i = 0; i < ans.size(); i++) {
              printf("%d %d\n", ans[i].first, ans[i].second);
            }
            return 0;
          }
          for (int k = j; k > i; k--) {
            ope(k, 1, k - 1, 1);
          }
          ans.clear();
        } else if (i > j) {
          ans.push_back(pair<int, int>(i, 1));
          for (int k = i; k > j; k--) {
            ope(k, 1, k - 1, 1);
          }
          bool t = true;
          for (int k = 1; k <= n; k++) {
            if (s[k][1] != g[k][1]) t = false;
          }
          if (t) {
            printf("%d\n", ans.size() - 1);
            for (int i = 0; i < ans.size(); i++) {
              printf("%d %d\n", ans[i].first, ans[i].second);
            }
            return 0;
          }
          for (int k = j; k < i; k++) {
            ope(k, 1, k + 1, 1);
          }
          ans.clear();
        }
      }
    }
    cout << -1 << endl;
  }
}
