#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
inline long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
inline long long add(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x += _y;
  return _x >= _mod ? _x - _mod : _x;
}
inline long long sub(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x -= _y;
  return _x < 0 ? _x + _mod : _x;
}
inline long long mul(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x *= _y;
  return _x >= _mod ? _x % _mod : _x;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1LL;
  long long _ret = mypow(mul(_a, _a, _mod), _x >> 1, _mod);
  if (_x & 1) _ret = mul(_ret, _a, _mod);
  return _ret;
}
long long mymul(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 0LL;
  long long _ret = mymul(add(_a, _a, _mod), _x >> 1, _mod);
  if (_x & 1) _ret = add(_ret, _a, _mod);
  return _ret;
}
inline bool equal(double _x, double _y) {
  return _x > _y - 1e-9 && _x < _y + 1e-9;
}
int __ = 1, _cs;
void build() {}
int n, m;
char c[2][55][55], t[55][55];
bool rev;
inline char chg(char ctmp) {
  if (ctmp == 'U') return 'L';
  if (ctmp == 'D') return 'R';
  if (ctmp == 'L') return 'U';
  if (ctmp == 'R') return 'D';
  assert(false);
  return 0;
}
void init() {
  n = getint();
  m = getint();
  for (int i = 0; i < 2; i++)
    for (int j = 1; j <= n; j++) scanf("%s", c[i][j] + 1);
  if (n & 1) {
    for (int i = 0; i < 2; i++) {
      for (int j = 1; j <= n; j++)
        for (int k = 1; k <= m; k++) t[k][j] = chg(c[i][j][k]);
      for (int j = 1; j <= m; j++)
        for (int k = 1; k <= n; k++) c[i][j][k] = t[j][k];
    }
    swap(n, m);
    rev = true;
  }
}
vector<pair<int, int> > op;
void turn(int iid, int id, int i, int j) {
  if (id == 0) {
    if (c[iid][i + 1][j] != 'L') turn(iid, 1, i + 1, j);
    op.push_back({i, j});
    c[iid][i][j] = 'U';
    c[iid][i][j + 1] = 'U';
    c[iid][i + 1][j] = 'D';
    c[iid][i + 1][j + 1] = 'D';
  } else {
    if (c[iid][i][j + 1] != 'U') turn(iid, 0, i, j + 1);
    op.push_back({i, j});
    c[iid][i][j] = 'L';
    c[iid][i][j + 1] = 'R';
    c[iid][i + 1][j] = 'L';
    c[iid][i + 1][j + 1] = 'R';
  }
}
void Reset(int id) {
  for (int i = 1; i <= n; i += 2)
    for (int j = 1; j <= m; j++)
      if (c[id][i][j] != 'U') turn(id, 0, i, j);
}
void solve() {
  Reset(0);
  vector<pair<int, int> > top = op;
  op.clear();
  Reset(1);
  reverse(op.begin(), op.end());
  for (auto i : op) top.push_back(i);
  op = top;
  printf("%d\n", (int)op.size());
  for (auto i : op)
    if (rev)
      printf("%d %d\n", i.second, i.first);
    else
      printf("%d %d\n", i.first, i.second);
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
