#include <bits/stdc++.h>
using namespace std;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
struct pol {
  int op, x, y;
};
struct pkt {
  int x, y;
};
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  char G[500][500];
  for (int i = 0; i < n; ++i) scanf("%s", &G[i]);
  vector<pol> odp;
  vector<vector<bool> > odw(n, vector<bool>(m, false));
  queue<pkt> Q;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (G[i][j] == '.' && !odw[i][j]) {
        odw[i][j] = true;
        Q.push({i, j});
        vector<pkt> spojna;
        while (!Q.empty()) {
          pkt akt = Q.front();
          Q.pop();
          spojna.push_back(akt);
          odp.push_back({0, akt.x, akt.y});
          for (int k = 0; k < 4; ++k) {
            pkt nowy = {akt.x + dx[k], akt.y + dy[k]};
            if (nowy.x >= 0 && nowy.x < n && nowy.y >= 0 && nowy.y < m) {
              if (!odw[nowy.x][nowy.y] && G[nowy.x][nowy.y] == '.') {
                odw[nowy.x][nowy.y] = true;
                Q.push(nowy);
              }
            }
          }
        }
        for (int k = spojna.size() - 1; k >= 1; --k) {
          odp.push_back({-1, spojna[k].x, spojna[k].y});
          odp.push_back({1, spojna[k].x, spojna[k].y});
        }
      }
    }
  }
  printf("%d\n", odp.size());
  for (int i = 0; i < odp.size(); ++i) {
    if (odp[i].op == 0) printf("B ");
    if (odp[i].op == 1) printf("R ");
    if (odp[i].op == -1) printf("D ");
    printf("%d %d\n", odp[i].x + 1, odp[i].y + 1);
  }
  return 0;
}
