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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <bits/stdc++.h>
#define MAX_N 2007
#define MAX_L 30
using namespace std;

int lr[MAX_N][MAX_L];
int ud[MAX_N][MAX_L];
int lrIlosc[MAX_N];
int udIlosc[MAX_N];
bool usedlr[MAX_N];
bool usedud[MAX_N];

struct kolor{
	bool rzad; //0 - lr, 1 - ud
	int nr;
	char color;
};

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n, m;
	cin >> n >> m;
	string gra[n];
	for(int i = 0; i < n; i++) cin >> gra[i];
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			lr[i][gra[i][j] - 'A']++;
		}
	}
	for(int i = 0; i < m; i++){
		for(int j = 0; j < n; j++){
			ud[i][gra[j][i] - 'A']++;
		}
	}
	vector<kolor> wynik;
	queue<kolor> q;
	for(int i = 0; i < m; i++){
		for(int j = 0; j < MAX_L; j++){
			if(ud[i][j]) udIlosc[i]++;
		}
	}
	for(int i = 0; i < n; i++){
		for(int j = 0; j < MAX_L; j++){
			if(lr[i][j]) lrIlosc[i]++;
		}
	}
	char k;
	bool ok = 0;
	for(int i = 0; i < n; i++){
		if(lrIlosc[i] == 1){
			q.push({0, i, gra[i][0]});
		}
	}
	for(int i = 0; i < m; i++){
		if(udIlosc[i] == 1){
			q.push({1, i, gra[0][i]});
		}
	}
	
	bool t;
	int w;
	while(!q.empty()){
		t = q.front().rzad;
		w = q.front().nr;
		k = q.front().color;
		q.pop();
		if(!t){
			if(lrIlosc[w] == 0) continue;
			wynik.push_back({0, w+1, k});
			lrIlosc[w] = 0;
			usedlr[w] = 1;
			for(int j = 0; j < m; j++){
				if(!usedud[j]){
					ud[j][gra[w][j] - 'A']--;
					if(!ud[j][gra[w][j] - 'A']){
						udIlosc[j]--;
						if(udIlosc[j] == 1){
							for(int l = 0; l < MAX_L; l++){
								if(ud[j][l]){
									k = char('A' + l);
									break;
								}
							}
							q.push({1, j, k});
						}
					}
				}
			}
		}else{
			if(udIlosc[w] == 0) continue;
			wynik.push_back({1, w+1, k});
			udIlosc[w] = 0;
			usedud[w] = 1;
			for(int j = 0; j < n; j++){
				if(!usedlr[j]){
					lr[j][gra[j][w] - 'A']--;
					if(!lr[j][gra[j][w] - 'A']){
						lrIlosc[j]--;
						if(lrIlosc[j] == 1){
							for(int l = 0; l < MAX_L; l++){
								if(lr[j][l]){
									k = char('A' + l);
									break;
								}
							}
							q.push({0, j, k});
						}
					}
				}
			}
		}
	}
	reverse(wynik.begin(), wynik.end());
	cout << wynik.size() << '\n';
	for(auto& i : wynik){
		if(!i.rzad) cout << "R ";
		else cout << "K ";
		cout << i.nr << " " << i.color << '\n';
	}
}