#include <bits/stdc++.h>
using namespace std;
int getint() {
  int x = 0;
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') x *= 10, x += (c - '0'), c = getchar();
  return x;
}
vector<pair<int, int> > ans;
int n, m, tag;
int a[40][40], b[40][40], cnt[910];
void init() {
  n = getint();
  m = getint();
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      a[i][j] = getint();
      cnt[a[i][j]]++;
      if (cnt[a[i][j]] == 1) tag++;
    }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      b[i][j] = getint();
      cnt[b[i][j]]--;
      if (cnt[b[i][j]] == 0) tag--;
      if (cnt[b[i][j]] < 0) tag = 10000;
    }
}
void solve2() {
  if (n == 1) {
    for (int i = 1; i <= m; i++)
      if (a[1][i] != b[1][i]) {
        for (int j = i + 1; j <= m; j++) {
          if (a[1][j] != b[1][i]) continue;
          bool tflag = true;
          for (int k = i; k < j; k++)
            if (a[1][k] != b[1][k + 1]) {
              tflag = false;
              break;
            }
          for (int k = j + 1; k <= m; k++)
            if (a[1][k] != b[1][k]) {
              tflag = false;
              break;
            }
          if (tflag) {
            printf("%d\n", j - i);
            for (int k = j; k >= i; k--) printf("1 %d\n", k);
            return;
          }
        }
        break;
      }
    for (int i = m; i >= 1; i--)
      if (a[1][i] != b[1][i]) {
        for (int j = i - 1; j >= 1; j--) {
          if (a[1][j] != b[1][i]) continue;
          bool tflag = true;
          for (int k = i; k > j; k--)
            if (a[1][k] != b[1][k - 1]) {
              tflag = false;
              break;
            }
          for (int k = j - 1; k >= 1; k--)
            if (a[1][k] != b[1][k]) {
              tflag = false;
              break;
            }
          if (tflag) {
            printf("%d\n", i - j);
            for (int k = j; k <= i; k++) printf("1 %d\n", k);
            return;
          }
        }
        break;
      }
    puts("-1");
    return;
  } else {
    for (int i = 1; i <= n; i++)
      if (a[i][1] != b[i][1]) {
        for (int j = i + 1; j <= n; j++) {
          if (a[j][1] != b[i][1]) continue;
          bool tflag = true;
          for (int k = i; k < j; k++)
            if (a[k][1] != b[k + 1][1]) {
              tflag = false;
              break;
            }
          for (int k = j + 1; k <= n; k++)
            if (a[k][1] != b[k][1]) {
              tflag = false;
              break;
            }
          if (tflag) {
            printf("%d\n", j - i);
            for (int k = j; k >= i; k--) printf("%d 1\n", k);
            return;
          }
        }
      }
    for (int i = n; i >= 1; i--)
      if (a[i][1] != b[i][1]) {
        for (int j = i - 1; j >= 1; j--) {
          if (a[j][1] != b[i][1]) continue;
          bool tflag = true;
          for (int k = i; k > j; k--)
            if (a[k][1] != b[k - 1][1]) {
              tflag = false;
              break;
            }
          for (int k = j - 1; k >= 1; k--)
            if (a[k][1] != b[k][1]) {
              tflag = false;
              break;
            }
          if (tflag) {
            printf("%d\n", i - j);
            for (int k = j; k <= i; k++) printf("%d 1\n", k);
            return;
          }
        }
        break;
      }
    puts("-1");
    return;
  }
}
int sn, sm;
void move(int ttn, int ttm) {
  while (sn != ttn && sm != ttm) {
    if (sn > ttn && sm > ttm) {
      int tswap = a[sn][sm];
      a[sn][sm] = a[sn - 1][sm - 1];
      a[sn - 1][sm - 1] = tswap;
      sn--;
      sm--;
    } else if (sn > ttn && sm < ttm) {
      int tswap = a[sn][sm];
      a[sn][sm] = a[sn - 1][sm + 1];
      a[sn - 1][sm + 1] = tswap;
      sn--;
      sm++;
    } else if (sn < ttn && sm > ttm) {
      int tswap = a[sn][sm];
      a[sn][sm] = a[sn + 1][sm - 1];
      a[sn + 1][sm - 1] = tswap;
      sn++;
      sm--;
    } else {
      int tswap = a[sn][sm];
      a[sn][sm] = a[sn + 1][sm + 1];
      a[sn + 1][sm + 1] = tswap;
      sn++;
      sm++;
    }
    ans.push_back(make_pair(sn, sm));
  }
  while (sn != ttn) {
    if (sn < ttn) {
      int tswap = a[sn][sm];
      a[sn][sm] = a[sn + 1][sm];
      a[sn + 1][sm] = tswap;
      sn++;
    } else {
      int tswap = a[sn][sm];
      a[sn][sm] = a[sn - 1][sm];
      a[sn - 1][sm] = tswap;
      sn--;
    }
    ans.push_back(make_pair(sn, sm));
  }
  while (sm != ttm) {
    if (sm < ttm) {
      int tswap = a[sn][sm];
      a[sn][sm] = a[sn][sm + 1];
      a[sn][sm + 1] = tswap;
      sm++;
    } else {
      int tswap = a[sn][sm];
      a[sn][sm] = a[sn][sm - 1];
      a[sn][sm - 1] = tswap;
      sm--;
    }
    ans.push_back(make_pair(sn, sm));
  }
}
void turn(int rn) {
  for (int i = m; i >= 1; i--) {
    move(1, 1);
    if (a[rn][i] == b[rn][i]) continue;
    int xn = 0, xm;
    for (int j = rn; j >= 1; j--) {
      for (int k = (j == rn ? i - 1 : m); k >= 1; k--)
        if (a[j][k] == b[rn][i]) {
          xn = j;
          xm = k;
          break;
        }
      if (xn) break;
    }
    if (xm > i && xn < rn) {
      while (xm > i && xn < rn && xm - i > rn - xn) {
        if (xn == 1) {
          move(xn, xm - 1);
          move(xn + 1, xm - 1);
          move(xn, xm);
          xn++;
          xm--;
        } else {
          move(xn - 1, xm);
          move(xn, xm - 1);
          move(xn, xm);
          xm--;
        }
      }
    }
    while (xn != rn && xm != i) {
      if (xm < i) {
        if (xn == 1) {
          move(xn, xm - 1);
          move(xn + 1, xm);
          move(xn + 1, xm + 1);
          move(xn, xm);
          xn++;
          xm++;
        } else {
          move(xn - 1, xm + 1);
          move(xn + 1, xm + 1);
          move(xn, xm);
          xn++;
          xm++;
        }
      } else {
        if (xn == 1) {
          move(xn, xm - 1);
          move(xn + 1, xm - 1);
          move(xn, xm);
          xn++;
          xm--;
        } else {
          move(xn - 1, xm - 1);
          move(xn + 1, xm - 1);
          move(xn, xm);
          xn++;
          xm--;
        }
      }
    }
    while (xn != rn) {
      if (xn == 1) {
        move(xn, xm - 1);
        move(xn + 1, xm);
        move(xn, xm);
        xn++;
      } else {
        move(xn - 1, xm);
        if (xm == 1)
          move(xn, xm + 1);
        else
          move(xn, xm - 1);
        move(xn + 1, xm);
        move(xn, xm);
        xn++;
      }
    }
    while (xm != i) {
      assert(xn - 1 >= 1 && xm + 1 <= m);
      move(xn - 1, xm);
      move(xn, xm + 1);
      move(xn, xm);
      xm++;
    }
  }
}
void turn2() {
  for (int j = m; j >= 1; j--)
    for (int i = 2; i >= 1; i--) {
      move(1, 1);
      if (a[i][j] == b[i][j]) continue;
      int xn = 0, xm;
      for (int k = j; k >= 1; k--) {
        for (int l = (k == j ? i - 1 : 2); l >= 1; l--) {
          if (a[l][k] == b[i][j]) {
            xn = l;
            xm = k;
            break;
          }
        }
        if (xn) break;
      }
      while (xn != i && xm != j) {
        if (xn < i) {
          move(xn + 1, xm - 1);
          move(xn + 1, xm + 1);
          move(xn, xm);
          xn++;
          xm++;
        } else {
          move(xn - 1, xm + 1);
          move(xn, xm);
          xn--;
          xm++;
        }
      }
      while (xn != i) {
        if (xn < i) {
          move(xn, xm - 1);
          move(xn + 1, xm);
          move(xn, xm);
          xn++;
        } else {
          move(xn - 1, xm);
          move(xn, xm);
          xn--;
        }
      }
      while (xm != j) {
        if (xn != 1) {
          move(xn - 1, xm);
          move(xn, xm + 1);
          move(xn, xm);
          xm++;
        } else {
          move(xn, xm - 1);
          move(xn + 1, xm);
          move(xn, xm + 1);
          move(xn, xm);
          xm++;
        }
      }
    }
}
void solve3() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      if (a[i][j] == b[1][1]) {
        sn = i;
        sm = j;
        break;
      }
    if (sn) break;
  }
  int an = sn, am = sm;
  move(1, 1);
  for (int i = n; i > 2; i--) turn(i);
  turn2();
  printf("%d\n", (int)ans.size());
  printf("%d %d\n", an, am);
  for (int i = 0; i < (int)ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
void solve() {
  if (tag != 0) {
    puts("-1");
    return;
  }
  if (n == 1 || m == 1)
    solve2();
  else
    solve3();
}
int main() {
  init();
  solve();
}
