#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;   }