#include <bits/stdc++.h>
using namespace std;
char ch = 0;
int mapx[3][110][110] = {0};
int n, m, blknum;
struct options {
  int ox, oy;
} ops[100010] = {0};
int opn = 0, preopn = 0;
inline void debug(int w) {
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) printf("%d%c", mapx[w][i][j], " \n"[j == m]);
  cout << endl;
}
inline void rot1(int x, int y, int cod) {
  register int tmp = mapx[cod][x][y];
  mapx[cod][x][y] = mapx[cod][x][y + 1];
  mapx[cod][x][y + 1] = mapx[cod][x + 1][y + 1];
  mapx[cod][x + 1][y + 1] = mapx[cod][x + 1][y];
  mapx[cod][x + 1][y] = tmp;
}
inline void go(int x, int y, int typ, int w) {
  if (typ == 0) {
    if (mapx[w][x][y + 1] != mapx[w][x + 1][y + 1]) go(x, y + 1, 1, w);
    rot1(x, y, w);
  } else {
    if (mapx[w][x + 1][y] != mapx[w][x + 1][y + 1]) go(x + 1, y, 0, w);
    rot1(x, y, w);
  }
  ops[++opn].ox = x;
  ops[opn].oy = y;
}
inline void solve() {
  bool flag = m % 2;
  for (int w = 1; w <= 2; w++) {
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) {
        if (flag && i % 2 && mapx[w][i][j] != mapx[w][i + 1][j]) go(i, j, 1, w);
        if ((!flag) && j % 2 && mapx[w][i][j] != mapx[w][i][j + 1])
          go(i, j, 0, w);
      }
    if (w == 1) preopn = opn;
  }
  printf("%d\n", opn);
  for (int i = 1; i <= preopn; i++) printf("%d %d\n", ops[i].ox, ops[i].oy);
  for (int i = opn; i > preopn; i--) printf("%d %d\n", ops[i].ox, ops[i].oy);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int w = 1; w <= 2; w++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) {
        ch = 0;
        while (ch < 'A' || ch > 'Z') ch = getchar();
        if (ch == 'U' || ch == 'L') blknum++;
        if (ch == 'U')
          mapx[w][i][j] = mapx[w][i + 1][j] = blknum;
        else if (ch == 'L')
          mapx[w][i][j] = mapx[w][i][j + 1] = blknum;
      }
  solve();
}
