#include <bits/stdc++.h>
using namespace std;
const int MAXN = 55;
vector<pair<int, int>> V[2];
char s[2][MAXN][MAXN];
int n, m;
bool check(int tp, int x, int y, int p) {
  if (p == 0) {
    return s[tp][x][y] == 'U' && s[tp][x][y + 1] == 'U';
  } else {
    return s[tp][x][y] == 'L' && s[tp][x + 1][y] == 'L';
  }
}
void upd(int tp, int x, int y, int p) {
  V[tp].push_back(make_pair(x, y));
  if (p == 0) {
    s[tp][x][y] = s[tp][x][y + 1] = 'U';
    s[tp][x + 1][y] = s[tp][x + 1][y + 1] = 'D';
  } else {
    s[tp][x][y] = s[tp][x + 1][y] = 'L';
    s[tp][x][y + 1] = s[tp][x + 1][y + 1] = 'R';
  }
}
void solve() {
  scanf("%d %d", &n, &m);
  for (int tp = 0; tp < 2; ++tp) {
    for (int i = 0; i < n; ++i) {
      scanf("%s", s[tp][i]);
    }
  }
  if (n % 2 == 0) {
    for (int tp = 0; tp < 2; ++tp) {
      for (int step = 0; step < 50; ++step) {
        for (int i = 0; i < n; ++i) {
          for (int j = 0; j < m; ++j) {
            if (check(tp, i, j, step & 1)) {
              upd(tp, i, j, !(step & 1));
            }
          }
        }
      }
      for (int j = 0; j < m; ++j) {
        bool ok = 1;
        for (int i = 0; i < n; i += 2) {
          ok &= (s[tp][i][j] == 'U');
        }
        if (ok) {
          continue;
        }
        for (int i = 1; i < n; i += 2) {
          if (s[tp][i][j] != 'U') {
            continue;
          }
          if (check(tp, i, j + 1, 1)) {
            upd(tp, i, j + 1, 0);
          }
          if (check(tp, i, j, 0)) {
            upd(tp, i, j, 1);
          }
        }
        for (int i = 0; i < n; ++i) {
          if (check(tp, i, j, 1)) {
            upd(tp, i, j, 0);
          }
        }
      }
      for (int j = 0; j < m; ++j) {
        bool ok = 1;
        for (int i = 0; i < n; i += 2) {
          ok &= (s[tp][i][j] == 'U');
        }
        assert(ok);
      }
    }
  } else {
    for (int tp = 0; tp < 2; ++tp) {
      for (int step = 0; step < 100; ++step) {
        for (int i = 0; i < n; ++i) {
          for (int j = 0; j < m; ++j) {
            if (check(tp, i, j, step & 1)) {
              upd(tp, i, j, !(step & 1));
            }
          }
        }
      }
      for (int i = 0; i < n; ++i) {
        bool ok = 1;
        for (int j = 0; j < m; j += 2) {
          ok &= (s[tp][i][j] == 'L');
        }
        if (ok) {
          continue;
        }
        for (int j = 1; j < m; j += 2) {
          if (s[tp][i][j] != 'L') {
            continue;
          }
          if (check(tp, i + 1, j, 0)) {
            upd(tp, i + 1, j, 1);
          }
          if (check(tp, i, j, 1)) {
            upd(tp, i, j, 0);
          }
        }
        for (int j = 0; j < m; ++j) {
          if (check(tp, i, j, 0)) {
            upd(tp, i, j, 1);
          }
        }
      }
      for (int i = 0; i < n; ++i) {
        bool ok = 1;
        for (int j = 0; j < m; j += 2) {
          ok &= (s[tp][i][j] == 'L');
        }
        assert(ok);
      }
    }
  }
  printf("%d\n", V[0].size() + V[1].size());
  reverse((V[1]).begin(), (V[1]).end());
  for (int tp = 0; tp < 2; ++tp) {
    for (auto it : V[tp]) {
      printf("%d %d\n", it.first + 1, it.second + 1);
    }
  }
}
int main() {
  int tt = 1;
  while (tt--) {
    solve();
  }
  return 0;
}
