#include <bits/stdc++.h>
using namespace std;
const int maxM = 1e5 + 10, maxN = 55;
int N, M, n, m, cnt, res;
int G[maxN + 1][maxN + 1], T[maxN + 1][maxN + 1];
char s[maxN + 1][maxN + 1];
bool flag;
pair<int, int> ans[maxM + 1];
inline void get() {
  cnt = 0;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if (s[i][j] == 'L' || s[i][j] == 'U')
        G[i][j] = ++cnt;
      else if (s[i][j] == 'R')
        G[i][j] = G[i][j - 1];
      else
        G[i][j] = G[i - 1][j];
}
inline void reverse() {
  for (int j = 1; j <= m; j++)
    for (int i = 1; i <= n; i++) T[m - j + 1][i] = G[i][j];
  for (int i = 1; i <= m; i++)
    for (int j = 1; j <= n; j++) G[i][j] = T[i][j];
}
inline void change(int x, int y) {
  if (flag)
    ans[++res] = make_pair(y, m - x);
  else
    ans[++res] = make_pair(x, y);
  int t[2][2];
  for (int j = 0; j < 2; j++)
    for (int i = 0; i < 2; i++) t[1 - j][i] = G[x + i][y + j];
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < 2; j++) G[x + i][y + j] = t[i][j];
}
inline void flip(int x, int y, int t) {
  if (!t) {
    if (G[x][y + 1] == G[x + 1][y + 1])
      change(x, y);
    else
      flip(x, y + 1, t ^ 1), change(x, y);
  } else {
    if (G[x + 1][y] == G[x + 1][y + 1])
      change(x, y);
    else
      flip(x + 1, y, t ^ 1), change(x, y);
  }
}
inline void work() {
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= M; j += 2) {
      if (G[i][j] == G[i][j + 1]) continue;
      flip(i, j, 0);
    }
}
int main() {
  scanf("%d %d", &n, &m);
  if (m & 1)
    N = m, M = n, flag = true;
  else
    N = n, M = m, flag = false;
  for (int i = 1; i <= n; i++) scanf("%s", s[i] + 1);
  get();
  if (flag) reverse();
  work();
  int t = res;
  for (int i = 1; i <= n; i++) scanf("%s", s[i] + 1);
  get();
  if (flag) reverse();
  work();
  printf("%d\n", res);
  for (int i = 1; i <= t; i++) printf("%d %d\n", ans[i].first, ans[i].second);
  for (int i = res; i > t; i--) printf("%d %d\n", ans[i].first, ans[i].second);
  return 0;
}
