#include <bits/stdc++.h>
using namespace std;
bool SR(int &_x) { return scanf("%d", &_x) == 1; }
bool SR(long long &_x) { return scanf("%lld", &_x) == 1; }
bool SR(double &_x) { return scanf("%lf", &_x) == 1; }
bool SR(char *_s) { return scanf("%s", _s) == 1; }
bool RI() { return true; }
template <typename I, typename... T>
bool RI(I &_x, T &..._tail) {
  return SR(_x) && RI(_tail...);
}
void SP(const int _x) { printf("%d", _x); }
void SP(const long long _x) { printf("%lld", _x); }
void SP(const double _x) { printf("%.16lf", _x); }
void SP(const char *s) { printf("%s", s); }
void PL() { puts(""); }
template <typename I, typename... T>
void PL(const I _x, const T... _tail) {
  SP(_x);
  if (sizeof...(_tail)) putchar(' ');
  PL(_tail...);
}
const int maxn = 55;
struct Solver {
  int wid, hei;
  char mp[maxn][maxn];
  void rot(int x, int y) {
    if (mp[x][y] == 'L') {
      for (int i : {x, x + 1})
        for (int j : {y, y + 1}) mp[i][j] = "UD"[i - x];
    } else {
      for (int i : {x, x + 1})
        for (int j : {y, y + 1}) mp[i][j] = "LR"[j - y];
    }
  }
  vector<pair<int, int> > solve() {
    assert(wid % 2 == 0);
    vector<pair<int, int> > ret;
    for (int i = 0; i < int(hei); i++)
      for (int j = 0; j < wid; j += 2) {
        vector<pair<int, int> > cur;
        int x = i, y = j, f = 0;
        while (1) {
          if ((f == 0 && mp[x][y] == 'L') || (f == 1 && mp[x][y] == 'U')) break;
          cur.push_back({x, y});
          if (f == 0)
            y++;
          else
            x++;
          f ^= 1;
        }
        reverse((cur).begin(), (cur).end());
        for (auto p : cur) rot(p.first, p.second);
        ret.insert(ret.end(), (cur).begin(), (cur).end());
      }
    return ret;
  }
} sol0, sol1;
int n, m;
char f0[maxn][maxn], f1[maxn][maxn];
void read() {
  RI(n, m);
  for (int i = 0; i < int(n); i++) RI(f0[i]);
  for (int i = 0; i < int(n); i++) RI(f1[i]);
}
bool flip;
void build() {
  if (m % 2) {
    flip = 1;
    auto rev = [&](char c) {
      if (c == 'L') return 'U';
      if (c == 'R') return 'D';
      if (c == 'U') return 'L';
      if (c == 'D') return 'R';
      assert(0);
    };
    {
      sol0.hei = m;
      sol0.wid = n;
      for (int i = 0; i < int(n); i++)
        for (int j = 0; j < int(m); j++) sol0.mp[j][i] = rev(f0[i][j]);
      sol1.hei = m;
      sol1.wid = n;
      for (int i = 0; i < int(n); i++)
        for (int j = 0; j < int(m); j++) sol1.mp[j][i] = rev(f1[i][j]);
    }
  } else {
    sol0.hei = n;
    sol0.wid = m;
    for (int i = 0; i < int(n); i++)
      for (int j = 0; j < int(m); j++) sol0.mp[i][j] = f0[i][j];
    sol1.hei = n;
    sol1.wid = m;
    for (int i = 0; i < int(n); i++)
      for (int j = 0; j < int(m); j++) sol1.mp[i][j] = f1[i][j];
  }
}
void sol() {
  auto res0 = sol0.solve(), res1 = sol1.solve();
  reverse((res1).begin(), (res1).end());
  res0.insert(res0.end(), (res1).begin(), (res1).end());
  if (flip)
    for (auto &p : res0) swap(p.first, p.second);
  PL(((int)(res0).size()));
  for (auto p : res0) PL(p.first + 1, p.second + 1);
}
int main() {
  read();
  build();
  sol();
  return 0;
}
