1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
//Sylwia Sapkowska
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "unroll-loops")
using namespace std;

void __print(int x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << "'" << x << "'";}
void __print(const char *x) {cerr << '"' << x << '"';}
void __print(const string &x) {cerr << '"' << x << '"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifdef LOCAL
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif

#define int long long
typedef pair<int, int> T;
const int oo = 1e18, oo2 = 1e9+7, K = 30;
const int mod = 998244353;

void solve(){
    int n, m; cin >> n >> m;
    vector a(n+1, vector<char>(m+1));
    array<int, 2>mx = {n, m};
    vector<vector<vector<int>>>cnt(2);
    vector<vector<int>>diff(2);
    for (int rep = 0; rep < 2; rep++){
        cnt[rep].assign(mx[rep]+1, vector<int>(K,0));
        diff[rep].assign(mx[rep]+1, 0);
    }
    for (int i = 1; i<=n; i++){
        for (int j = 1; j<=m; j++){
            cin >> a[i][j];
            cnt[0][i][a[i][j]-'A']++;
            cnt[1][j][a[i][j]-'A']++;
            if (cnt[0][i][a[i][j]-'A'] == 1) diff[0][i]++;
            if (cnt[1][j][a[i][j]-'A'] == 1) diff[1][j]++;
        }
    }
    queue<T>q;
    for (int rep = 0; rep < 2; rep++){
        for (int k = 1; k <= mx[rep]; k++){
            if (diff[rep][k] <= 1){
                q.push({k, rep});
            }
        }
    }
    vector<tuple<int, int, int>>ans;
    while ((int)q.size()){
        auto [i, f] = q.front();q.pop(); 
        int which = -1;
        for (int j = 0; j<K; j++){
            if (cnt[f][i][j]) {
                which = j;
            }
        }
        if (which == -1) continue; //nie wykona sie zaden wiersz ani kol wiecej niz raz
        ans.emplace_back(f, i, which);
        for (int j = 1; j<=mx[f^1]; j++){
            char c = (f ? a[j][i] : a[i][j]);
            if (c == '.') continue;
            cnt[f^1][j][c-'A']--;
            cnt[f][i][c-'A']--;
            if (cnt[f^1][j][c-'A'] == 0) diff[f^1][j]--;
            if (diff[f^1][j] == 1) q.push({j, f^1});
            if (f) a[j][i] = '.';
            else a[i][j] = '.';
        }
    }
    cout << (int)ans.size() << "\n";
    reverse(ans.begin(), ans.end());
    for (auto [f, i, which]: ans){
        if (f) cout << "K ";
        else cout << "R ";
        cout << i << " " << (char)(which+'A') << "\n";
    }
}

int32_t main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t = 1;
    //cin >> t;
    while (t--) solve();

    return 0;
}