#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:256000000")
std::uniform_int_distribution<std::mt19937::result_type> udist(0, 1);
std::mt19937 rng;
using namespace std;
FILE *in, *out;
int ri() {
  int a;
  fscanf(in, "%d", &a);
  return a;
}
double rf() {
  double a;
  fscanf(in, "%lf", &a);
  return a;
}
char sbuf[100005];
string rstr() {
  char c;
  char *b = sbuf;
  while (c = fgetc(in)) {
    if (c == '\n' || c == 255) break;
    *b++ = c;
  }
  *b = 0;
  return sbuf;
}
long long nod(long long a, long long b) {
  if (a == 1 || b == 1) return 1;
  if (a == 0) return b;
  if (b == 0) return a;
  return nod(b % a, a);
}
vector<int> primes;
void calculatePrimes() {
  primes.push_back(2);
  for (int i = 3; i < 100000; i += 2) {
    bool bFound = false;
    int m = (int)sqrt((float)i);
    for (int j = 1; j < primes.size() && !bFound && primes[j] <= m; j++)
      bFound = ((i % primes[j]) == 0);
    if (!bFound) primes.push_back(i);
  }
}
bool isPrime(int p) {
  for (int i : primes)
    if (p != i && (p % i) == 0) return false;
  return true;
}
void egcd(int a, int b, int &g, int &x, int &y) {
  if (a == 0) {
    g = b;
    x = 0;
    y = 1;
    return;
  }
  egcd(b % a, a, g, y, x);
  x = x - (b / a) * y;
}
int modinv(int a, int m) {
  int g = 0, x = 0, y = 0;
  egcd(a, m, g, x, y);
  return (x + m) % m;
}
vector<pair<int, int>> ops;
void rotate(vector<string> &a, vector<string> &b, int i, int j) {
  if (i < 0 || j < 0) return;
  if (i >= a.size() - 1 || j >= a[0].size() - 1) return;
  if (a[i][j] == 'L' && a[i + 1][j] == 'L' &&
      (b[i][j] == 'U' || b[i][j + 1] == 'U')) {
    ops.push_back(make_pair(i, j));
    a[i][j] = 'U';
    a[i][j + 1] = 'U';
    a[i + 1][j] = 'D';
    a[i + 1][j + 1] = 'D';
    rotate(a, b, i, j - 1);
    rotate(a, b, i, j + 1);
  } else if (a[i][j] == 'U' && a[i][j + 1] == 'U' &&
             (b[i][j] == 'L' || b[i + 1][j] == 'L')) {
    ops.push_back(make_pair(i, j));
    a[i][j] = 'L';
    a[i][j + 1] = 'R';
    a[i + 1][j] = 'L';
    a[i + 1][j + 1] = 'R';
    rotate(a, b, i - 1, j);
    rotate(a, b, i + 1, j);
  }
}
bool ensure(vector<string> &a, vector<string> &b, char c, int i, int j) {
  if (i < 0 || j < 0) return false;
  if (i >= a.size() || j >= a[0].size()) return false;
  if (a[i][j] == c) return true;
  if (c == 'U' && a[i][j] == 'R') {
    return ensure(a, b, 'U', i, j - 1);
  }
  if (c == 'L' && a[i][j] == 'B') {
    return ensure(a, b, 'L', i - 1, j);
  }
  if (c == 'L' && a[i][j] == 'R') {
    ensure(a, b, 'U', i, j + 1);
    ensure(a, b, 'U', i, j - 1);
    ops.push_back(make_pair(i, j));
    a[i][j] = 'L';
    a[i][j + 1] = 'R';
    a[i + 1][j] = 'L';
    a[i + 1][j + 1] = 'R';
    return true;
  }
  if (a[i][j] == 'L' && c == 'U') {
    if (!ensure(a, b, 'L', i + 1, j)) {
      return false;
    }
    ops.push_back(make_pair(i, j));
    a[i][j] = 'U';
    a[i][j + 1] = 'U';
    a[i + 1][j] = 'D';
    a[i + 1][j + 1] = 'D';
  } else if (a[i][j] == 'U' && c == 'L') {
    if (!ensure(a, b, 'U', i, j + 1)) {
      return false;
    }
    ops.push_back(make_pair(i, j));
    a[i][j] = 'L';
    a[i][j + 1] = 'R';
    a[i + 1][j] = 'L';
    a[i + 1][j + 1] = 'R';
  } else {
    return false;
  }
  return true;
}
int main() {
  rng.seed(time(NULL));
  srand(time(NULL));
  int n, m;
  cin >> n >> m;
  vector<string> a(n), b(n);
  for (int i = (0); i < (((n))); ++i) cin >> a[i];
  for (int i = (0); i < (((n))); ++i) cin >> b[i];
  int size = 0;
  while (true) {
    for (int i = (0); i < (((n - 1))); ++i) {
      for (int j = (0); j < (((m - 1))); ++j) {
        ensure(a, b, b[i][j], i, j);
      }
    }
    break;
  }
  cout << ops.size() << endl;
  for (int i = (0); i < (((ops.size()))); ++i) {
    cout << ops[i].first + 1 << " " << ops[i].second + 1 << endl;
  }
  return 0;
}
