#include <bits/stdc++.h>
using namespace std;
char M[3][51][51];
struct xy {
  int x, y;
};
vector<xy> L[2];
bool is_ud(int k, int x, int y) {
  return M[k][x][y] == 'U' && M[k][x + 1][y] == 'D' && M[k][x][y + 1] == 'U' &&
         M[k][x + 1][y + 1] == 'D';
}
bool is_lr(int k, int x, int y) {
  return M[k][x][y] == 'L' && M[k][x][y + 1] == 'R' && M[k][x + 1][y] == 'L' &&
         M[k][x + 1][y + 1] == 'R';
}
void mk_lrtoud(int k, int x, int y) {
  L[k].push_back({x + 1, y + 1});
  M[k][x][y] = 'U';
  M[k][x + 1][y] = 'D';
  M[k][x][y + 1] = 'U';
  M[k][x + 1][y + 1] = 'D';
}
void mk_udtolr(int k, int x, int y) {
  L[k].push_back({x + 1, y + 1});
  M[k][x][y] = 'L';
  M[k][x][y + 1] = 'R';
  M[k][x + 1][y] = 'L';
  M[k][x + 1][y + 1] = 'R';
}
int main() {
  int n, m, i, j, k;
  scanf("%d%d", &n, &m);
  if (n % 2 == 1 && m % 2 == 1) {
    printf("-1");
    return 0;
  }
  for (i = 0; i < n; i += 2) {
    for (j = 0; j < m; j += 2) {
      if (n % 2 == 0)
        mk_lrtoud(2, i, j);
      else
        mk_udtolr(2, i, j);
    }
  }
  for (k = 0; k < 2; k++)
    for (i = 0; i < n; i++)
      for (j = 0; j < m; j++) scanf(" %c", &M[k][i][j]);
  for (k = 0; k < 2; k++) {
    bool flag = 0;
    while (1) {
      bool ck = 1;
      for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
          if (M[k][i][j] != M[2][i][j]) ck = 0;
        }
      }
      if (ck) break;
      for (i = 0; i < n - 1; i++) {
        for (j = 0; j < m - 1; j++) {
          if (flag) {
            if (is_lr(k, i, j)) mk_lrtoud(k, i, j);
          } else {
            if (is_ud(k, i, j)) mk_udtolr(k, i, j);
          }
        }
      }
      flag = !flag;
    }
  }
  printf("%d\n", L[0].size() + L[1].size());
  for (i = 0; i < L[0].size(); i++) printf("%d %d\n", L[0][i].x, L[0][i].y);
  for (i = L[1].size() - 1; i >= 0; i--)
    printf("%d %d\n", L[1][i].x, L[1][i].y);
  return 0;
}
