#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:216000000")
using namespace std;
const long long MAX = numeric_limits<long long>::max();
const long long MIN = numeric_limits<long long>::min();
const double PI = 3.1415926535;
const long long MOD = 1000000007;
template <class T>
ostream& operator<<(ostream& out, vector<T>& v) {
  for (int i = 0; i < v.size(); ++i) out << v[i] << " ";
  out << endl;
  return out;
}
template <class T>
istream& operator>>(istream& in, vector<T>& v) {
  for (int i = 0; i < v.size(); ++i) in >> v[i];
  return in;
}
template <class T>
T lexical_cast(string& s) {
  stringstream ss(s);
  T t;
  ss >> t;
  return t;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long ceil(long long a, long long b) {
  if (a % b) return a / b + 1;
  return a / b;
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  vector<vector<char>> f1(n, vector<char>(m));
  vector<vector<char>> f2(n, vector<char>(m));
  for (int i = 0; i < f1.size(); ++i) {
    for (int j = 0; j < f1[i].size(); ++j) {
      cin >> f1[i][j];
    }
  }
  for (int i = 0; i < f2.size(); ++i) {
    for (int j = 0; j < f2[i].size(); ++j) {
      cin >> f2[i][j];
    }
  }
  if (n % 2 == 0) {
    vector<pair<int, int>> steps1;
    while (1) {
      for (int i = 0; i < f1.size() - 1; ++i) {
        for (int j = 0; j < f1[i].size() - 1; ++j) {
          if (f1[i][j] == 'U' && f1[i][j + 1] == 'U') {
            f1[i][j] = 'L';
            f1[i + 1][j] = 'L';
            f1[i][j + 1] = 'R';
            f1[i + 1][j + 1] = 'R';
            steps1.push_back(make_pair(i, j));
          }
        }
      }
      for (int i = 0; i < f1.size() - 1; ++i) {
        for (int j = 0; j < f1[i].size() - 1; ++j) {
          if (f1[i][j] == 'L' && f1[i + 1][j] == 'L') {
            f1[i][j] = 'U';
            f1[i + 1][j] = 'D';
            f1[i][j + 1] = 'U';
            f1[i + 1][j + 1] = 'D';
            steps1.push_back(make_pair(i, j));
          }
        }
      }
      bool finish = true;
      for (int i = 0; i < f1.size(); ++i) {
        for (int j = 0; j < f1[i].size(); ++j) {
          if (f1[i][j] == 'L' || f1[i][j] == 'R') finish = false;
        }
      }
      if (finish) break;
    }
    vector<pair<int, int>> steps2;
    while (1) {
      for (int i = 0; i < f2.size() - 1; ++i) {
        for (int j = 0; j < f2[i].size() - 1; ++j) {
          if (f2[i][j] == 'U' && f2[i][j + 1] == 'U') {
            f2[i][j] = 'L';
            f2[i + 1][j] = 'L';
            f2[i][j + 1] = 'R';
            f2[i + 1][j + 1] = 'R';
            steps2.push_back(make_pair(i, j));
          }
        }
      }
      for (int i = 0; i < f2.size() - 1; ++i) {
        for (int j = 0; j < f2[i].size() - 1; ++j) {
          if (f2[i][j] == 'L' && f2[i + 1][j] == 'L') {
            f2[i][j] = 'U';
            f2[i + 1][j] = 'D';
            f2[i][j + 1] = 'U';
            f2[i + 1][j + 1] = 'D';
            steps2.push_back(make_pair(i, j));
          }
        }
      }
      bool finish = true;
      for (int i = 0; i < f2.size(); ++i) {
        for (int j = 0; j < f2[i].size(); ++j) {
          if (f2[i][j] == 'L' || f2[i][j] == 'R') finish = false;
        }
      }
      if (finish) break;
    }
    reverse(steps2.begin(), steps2.end());
    copy(steps2.begin(), steps2.end(), back_inserter(steps1));
    cout << steps1.size() << endl;
    for (int i = 0; i < steps1.size(); ++i) {
      cout << steps1[i].first + 1 << " " << steps1[i].second + 1 << endl;
    }
    return 0;
  } else {
    vector<pair<int, int>> steps1;
    while (1) {
      for (int i = 0; i < f1.size() - 1; ++i) {
        for (int j = 0; j < f1[i].size() - 1; ++j) {
          if (f1[i][j] == 'L' && f1[i + 1][j] == 'L') {
            f1[i][j] = 'U';
            f1[i + 1][j] = 'D';
            f1[i][j + 1] = 'U';
            f1[i + 1][j + 1] = 'D';
            steps1.push_back(make_pair(i, j));
          }
        }
      }
      for (int i = 0; i < f1.size() - 1; ++i) {
        for (int j = 0; j < f1[i].size() - 1; ++j) {
          if (f1[i][j] == 'U' && f1[i][j + 1] == 'U') {
            f1[i][j] = 'L';
            f1[i + 1][j] = 'L';
            f1[i][j + 1] = 'R';
            f1[i + 1][j + 1] = 'R';
            steps1.push_back(make_pair(i, j));
          }
        }
      }
      bool finish = true;
      for (int i = 0; i < f1.size(); ++i) {
        for (int j = 0; j < f1[i].size(); ++j) {
          if (f1[i][j] == 'U' || f1[i][j] == 'D') finish = false;
        }
      }
      if (finish) break;
    }
    vector<pair<int, int>> steps2;
    while (1) {
      for (int i = 0; i < f2.size() - 1; ++i) {
        for (int j = 0; j < f2[i].size() - 1; ++j) {
          if (f2[i][j] == 'L' && f2[i + 1][j] == 'L') {
            f2[i][j] = 'U';
            f2[i + 1][j] = 'D';
            f2[i][j + 1] = 'U';
            f2[i + 1][j + 1] = 'D';
            steps2.push_back(make_pair(i, j));
          }
        }
      }
      for (int i = 0; i < f2.size() - 1; ++i) {
        for (int j = 0; j < f2[i].size() - 1; ++j) {
          if (f2[i][j] == 'U' && f2[i][j + 1] == 'U') {
            f2[i][j] = 'L';
            f2[i + 1][j] = 'L';
            f2[i][j + 1] = 'R';
            f2[i + 1][j + 1] = 'R';
            steps2.push_back(make_pair(i, j));
          }
        }
      }
      bool finish = true;
      for (int i = 0; i < f2.size(); ++i) {
        for (int j = 0; j < f2[i].size(); ++j) {
          if (f2[i][j] == 'U' || f2[i][j] == 'D') finish = false;
        }
      }
      if (finish) break;
    }
    reverse(steps2.begin(), steps2.end());
    copy(steps2.begin(), steps2.end(), back_inserter(steps1));
    cout << steps1.size() << endl;
    for (int i = 0; i < steps1.size(); ++i) {
      cout << steps1[i].first + 1 << " " << steps1[i].second + 1 << endl;
    }
    return 0;
  }
}
