#include <bits/stdc++.h>
using namespace std;
const int N = 60;
int n, m;
char s[N][N], t[N][N];
int cntop, lastcnt = -1;
int opx[1000010], opy[1000010];
int sl, su, tl, tu;
bool legals() {
  int cnt[4] = {};
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (s[i][j] == 'L') {
        if (s[i][j + 1] != 'R') {
          return 0;
        }
        ++cnt[0];
      } else if (s[i][j] == 'R') {
        if (s[i][j - 1] != 'L') {
          return 0;
        }
        ++cnt[1];
      } else if (s[i][j] == 'U') {
        if (s[i + 1][j] != 'D') {
          return 0;
        }
        ++cnt[2];
      } else {
        if (s[i - 1][j] != 'U') {
          return 0;
        }
        ++cnt[3];
      }
    }
  }
  if (cnt[0] != cnt[1] || cnt[2] != cnt[3]) {
    return 0;
  }
  sl = cnt[0];
  su = cnt[2];
  return 1;
}
bool legalt() {
  int cnt[4] = {};
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (t[i][j] == 'L') {
        if (t[i][j + 1] != 'R') {
          return 0;
        }
        ++cnt[0];
      } else if (t[i][j] == 'R') {
        if (t[i][j - 1] != 'L') {
          return 0;
        }
        ++cnt[1];
      } else if (t[i][j] == 'U') {
        if (t[i + 1][j] != 'D') {
          return 0;
        }
        ++cnt[2];
      } else {
        if (t[i - 1][j] != 'U') {
          return 0;
        }
        ++cnt[3];
      }
    }
  }
  if (cnt[0] != cnt[1] || cnt[2] != cnt[3]) {
    return 0;
  }
  tl = cnt[0];
  tu = cnt[2];
  return 1;
}
bool equal() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (s[i][j] != t[i][j]) {
        return 0;
      }
    }
  }
  return 1;
}
void dfs(int u, int v, char to) {
  if (s[u][v] == to) {
    return;
  }
  if (to == 'L') {
    if (s[u][v] == 'U') {
      dfs(u, v + 1, 'U');
      ++cntop;
      opx[cntop] = u;
      opy[cntop] = v;
      s[u][v] = s[u + 1][v] = 'L';
      s[u][v + 1] = s[u + 1][v + 1] = 'R';
    } else {
      dfs(u, v - 1, 'U');
      dfs(u, v + 1, 'U');
      ++cntop;
      opx[cntop] = u;
      opy[cntop] = v;
      s[u][v] = s[u + 1][v] = 'L';
      s[u][v + 1] = s[u + 1][v + 1] = 'R';
    }
  } else {
    if (s[u][v] == 'L') {
      dfs(u + 1, v, 'L');
      ++cntop;
      opx[cntop] = u;
      opy[cntop] = v;
      s[u][v] = s[u][v + 1] = 'U';
      s[u + 1][v] = s[u + 1][v + 1] = 'D';
    } else {
      dfs(u - 1, v, 'L');
      dfs(u + 1, v, 'L');
      ++cntop;
      opx[cntop] = u;
      opy[cntop] = v;
      s[u][v] = s[u][v + 1] = 'U';
      s[u + 1][v] = s[u + 1][v + 1] = 'D';
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  if ((n * m) & 1) {
    printf("-1\n");
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    scanf("%s", s[i] + 1);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%s", t[i] + 1);
  }
  if (!legals() || !legalt()) {
    printf("-1\n");
    return 0;
  }
  if ((sl & 1) != (tl & 1) || (su & 1) != (tu & 1)) {
    printf("-1\n");
    return 0;
  }
  while (!equal()) {
    if (cntop == lastcnt || cntop > 1e5) {
      printf("-1\n");
      return 0;
    }
    lastcnt = cntop;
    for (int i = 1; i < n; i++) {
      for (int j = 1; j < m; j++) {
        if (s[i][j] == 'L' || s[i][j] == 'U') {
          if (t[i][j] == 'L' || t[i][j] == 'U') {
            dfs(i, j, t[i][j]);
          }
        }
      }
    }
  }
  printf("%d\n", cntop);
  for (int i = 1; i <= cntop; i++) {
    printf("%d %d\n", opx[i], opy[i]);
  }
  return 0;
}
