#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
const int N = 60;
char st[N][N], fin[N][N], s[N][N];
int n, m, which;
vector<pair<int, int> > oprt[2];
inline void doit(int i, int j) {
  oprt[which].push_back(pair<int, int>(i, j));
  if (s[i][j] == 'L') {
    s[i][j] = 'U';
    s[i + 1][j] = 'D';
    s[i][j + 1] = 'U';
    s[i + 1][j + 1] = 'D';
  } else {
    s[i][j] = 'L';
    s[i][j + 1] = 'R';
    s[i + 1][j] = 'L';
    s[i + 1][j + 1] = 'R';
  }
}
inline void solve(int i, int j, char want) {
  if (s[i][j] == want) return;
  if (want == 'U') {
    if (s[i + 1][j] != 'L') solve(i + 1, j, 'L');
    doit(i, j);
  } else {
    if (s[i][j + 1] != 'U') solve(i, j + 1, 'U');
    doit(i, j);
  }
}
inline void config() {
  for (int j = (1), _endtmp = (m); j <= (_endtmp); j++)
    for (int i = 1; i <= n; i += 2) {
      solve(i, j, 'U');
    }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (1), _endtmp = (n); i <= (_endtmp); i++) scanf("%s", st[i] + 1);
  for (int i = (1), _endtmp = (n); i <= (_endtmp); i++) scanf("%s", fin[i] + 1);
  bool revop = false;
  if (n & 1) {
    revop = true;
    for (int i = (1), _endtmp = (n); i <= (_endtmp); i++)
      for (int j = (1), _endtmp = (m); j <= (_endtmp); j++) s[i][j] = st[i][j];
    for (int i = (1), _endtmp = (n); i <= (_endtmp); i++)
      for (int j = (1), _endtmp = (m); j <= (_endtmp); j++) {
        if (s[i][j] == 'R')
          s[i][j] = 'U';
        else if (s[i][j] == 'L')
          s[i][j] = 'D';
        else if (s[i][j] == 'U')
          s[i][j] = 'L';
        else
          s[i][j] = 'R';
        st[m - j + 1][i] = s[i][j];
      }
    for (int i = (1), _endtmp = (n); i <= (_endtmp); i++)
      for (int j = (1), _endtmp = (m); j <= (_endtmp); j++) s[i][j] = fin[i][j];
    for (int i = (1), _endtmp = (n); i <= (_endtmp); i++)
      for (int j = (1), _endtmp = (m); j <= (_endtmp); j++) {
        if (s[i][j] == 'R')
          s[i][j] = 'U';
        else if (s[i][j] == 'L')
          s[i][j] = 'D';
        else if (s[i][j] == 'U')
          s[i][j] = 'L';
        else
          s[i][j] = 'R';
        fin[m - j + 1][i] = s[i][j];
      }
    swap(m, n);
  }
  for (int i = (1), _endtmp = (n); i <= (_endtmp); i++)
    for (int j = (1), _endtmp = (m); j <= (_endtmp); j++) {
      s[i][j] = st[i][j];
    }
  which = 0;
  config();
  for (int i = (1), _endtmp = (n); i <= (_endtmp); i++)
    for (int j = (1), _endtmp = (m); j <= (_endtmp); j++) {
      s[i][j] = fin[i][j];
    }
  which = 1;
  config();
  reverse((oprt[1]).begin(), (oprt[1]).end());
  printf("%d\n", ((int)(oprt[0]).size()) + ((int)(oprt[1]).size()));
  int x, y;
  for (int i = (0), _endtmp = (((int)(oprt[0]).size()) - 1); i <= (_endtmp);
       i++) {
    if (revop) {
      x = oprt[0][i].second;
      y = n - oprt[0][i].first;
    } else {
      x = oprt[0][i].first;
      y = oprt[0][i].second;
    }
    printf("%d %d\n", x, y);
  }
  for (int i = (0), _endtmp = (((int)(oprt[1]).size()) - 1); i <= (_endtmp);
       i++) {
    if (revop) {
      x = oprt[1][i].second;
      y = n - oprt[1][i].first;
    } else {
      x = oprt[1][i].first;
      y = oprt[1][i].second;
    }
    printf("%d %d\n", x, y);
  }
  return 0;
}
