#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
using namespace std;
const long long int N = 5e2 + 30, inf = 1e18;
bool visited[N][N];
vector<pair<char, pair<short int, short int> > > ans;
char c[N][N];
void d(int x, int y, int n, int m, pair<int, int> par) {
  if (visited[x][y]) return;
  visited[x][y] = 1;
  bool f = 0;
  if (x && !visited[x - 1][y] && c[x - 1][y] == '.') {
    if (!f) ans.push_back({'B', {x + 1, y + 1}});
    f = 1;
    d(x - 1, y, n, m, {x, y});
  }
  if (y && !visited[x][y - 1] && c[x][y - 1] == '.') {
    if (!f) ans.push_back({'B', {x + 1, y + 1}});
    f = 1;
    d(x, y - 1, n, m, {x, y});
  }
  if (x < n - 1 && !visited[x + 1][y] && c[x + 1][y] == '.') {
    if (!f) ans.push_back({'B', {x + 1, y + 1}});
    f = 1;
    d(x + 1, y, n, m, {x, y});
  }
  if (y < m - 1 && !visited[x][y + 1] && c[x][y + 1] == '.') {
    if (!f) ans.push_back({'B', {x + 1, y + 1}});
    f = 1;
    d(x, y + 1, n, m, {x, y});
  }
  if (par.first != -1 && f) {
    ans.push_back({'D', {x + 1, y + 1}});
    ans.push_back({'R', {x + 1, y + 1}});
  }
  if (par.first != -1 && !f) {
    ans.push_back({'R', {x + 1, y + 1}});
  }
  if (par.first == -1 && !f) {
    ans.push_back({'B', {x + 1, y + 1}});
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  for (long long int i = 0; i < n; i++) {
    for (long long int j = 0; j < m; j++) cin >> c[i][j];
  }
  for (long long int x = 0; x < n; x++) {
    for (long long int y = 0; y < m; y++) {
      if (!visited[x][y] && c[x][y] == '.') {
        d(x, y, n, m, {-1, -1});
      }
    }
  }
  cout << ans.size() << '\n';
  for (auto u : ans) {
    cout << u.first << ' ' << u.second.first << ' ' << u.second.second << '\n';
  }
}
