#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500;
int n, m;
char board[MAXN + 5][MAXN + 5];
vector<int> G[MAXN * MAXN];
int vis[MAXN * MAXN];
int mx[] = {0, 0, -1, 1};
int my[] = {1, -1, 0, 0};
vector<pair<int, int> > res;
int what[MAXN * MAXN];
inline bool ins(int x, int y) { return 0 <= x && x < n && 0 <= y && y < m; }
void destroy(int x) {
  res.push_back(make_pair(x, 3));
  what[x] = 0;
}
void blue(int x) {
  if (what[x] != 0 && what[x] != 1) destroy(x);
  if (what[x] != 1) {
    res.push_back(make_pair(x, 1));
    what[x] = 1;
  }
}
void red(int x) {
  if (what[x] != 0 && what[x] != 2) destroy(x);
  if (what[x] != 2) {
    res.push_back(make_pair(x, 2));
    what[x] = 2;
  }
}
void dfs(int x, int ref = 0) {
  vis[x] = 1;
  bool blued = false;
  for (int i = 0; i < G[x].size(); i++)
    if (!vis[G[x][i]]) {
      if (!blued) {
        blued = true;
        blue(x);
      }
      dfs(G[x][i], 1);
      red(G[x][i]);
    }
  if (ref == 0) blue(x);
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s", board[i]);
  for (int i = 0; i < n * m; i++) {
    int x = i / m;
    int y = i % m;
    if (board[x][y] == '#') continue;
    for (int j = 0; j < 4; j++)
      if (ins(x + mx[j], y + my[j]) && board[x + mx[j]][y + my[j]] == '.') {
        int k = (x + mx[j]) * m + y + my[j];
        G[i].push_back(k);
        G[k].push_back(i);
      }
  }
  for (int i = 0; i < n * m; i++) {
    if (!vis[i] && board[i / m][i % m] == '.') dfs(i);
  }
  printf("%d\n", res.size());
  for (int i = 0; i < res.size(); i++) {
    switch (res[i].second) {
      case 1:
        printf("B ");
        break;
      case 2:
        printf("R ");
        break;
      case 3:
        printf("D ");
        break;
    }
    printf("%d %d\n", res[i].first / m + 1, res[i].first % m + 1);
  }
  return 0;
}
