#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef basic_string<int> BI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(1); 
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
const int N=2010;
int n,m;
int rs[N][27],cs[N][27];
int rst[N],cst[N];
bool vis[2][N],d[N][N];
char s[N][N];
int main() {
	scanf("%d%d",&n,&m);
	rep(i,0,n) {
		scanf("%s",s[i]);
		rep(j,0,m) {
			rs[i][s[i][j]-'A']++;
			rst[i]|=1<<(s[i][j]-'A');
			cs[j][s[i][j]-'A']++;
			cst[j]|=1<<(s[i][j]-'A');
		}
	}
	queue<PII> q;
	rep(i,0,n) if (__builtin_popcount(rst[i])<=1) {
		q.push(mp(0,i));
		vis[0][i]=1;
	}
	rep(i,0,m) if (__builtin_popcount(cst[i])<=1) {
		q.push(mp(1,i));
		vis[1][i]=1;
	}
	vector<array<int,3>> ret;
	while (!q.empty()) {
		auto [u,c]=q.front(); q.pop();
		auto del=[&](int x,int y) {
			if (d[x][y]) return;
			int w=s[x][y]-'A';
			//printf("del %d %d\n",x,y);
			rs[x][w]--;
			cs[y][w]--;
			if (rs[x][w]==0) {
				rst[x]^=(1<<w);
				if (__builtin_popcount(rst[x])==1&&!vis[0][x]) {
					q.push(mp(0,x));
					vis[0][x]=1;
				}
			}
			if (cs[y][w]==0) {
				cst[y]^=(1<<w);
				if (__builtin_popcount(cst[y])==1&&!vis[1][y]) {
					q.push(mp(1,y));
					vis[1][y]=1;
				}
			}
			//puts("cnm");
		};
		if (u==0&&rst[c]==0) continue;
		if (u==1&&cst[c]==0) continue;
		if (u==0) {
			int let=__builtin_ctz(rst[c]);
			ret.pb({0,c,let});
			//VI rr(all(rs[c][let]));
			rep(x,0,m) del(c,x);
		} else {
			int let=__builtin_ctz(cst[c]);
			ret.pb({1,c,let});
			//VI cr(all(cs[c][let]));
			rep(x,0,n) del(x,c);
		}
	}
	printf("%d\n",SZ(ret));
	reverse(all(ret));
	for (auto [ty,c,let]:ret) {
		printf("%c %d %c\n","RK"[ty],c+1,'A'+let);
	}
}
        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  | #include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define eb emplace_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef basic_string<int> BI; typedef long long ll; typedef pair<int,int> PII; typedef double db; mt19937 mrand(1); const ll mod=1000000007; int rnd(int x) { return mrand() % x;} ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} // head const int N=2010; int n,m; int rs[N][27],cs[N][27]; int rst[N],cst[N]; bool vis[2][N],d[N][N]; char s[N][N]; int main() { scanf("%d%d",&n,&m); rep(i,0,n) { scanf("%s",s[i]); rep(j,0,m) { rs[i][s[i][j]-'A']++; rst[i]|=1<<(s[i][j]-'A'); cs[j][s[i][j]-'A']++; cst[j]|=1<<(s[i][j]-'A'); } } queue<PII> q; rep(i,0,n) if (__builtin_popcount(rst[i])<=1) { q.push(mp(0,i)); vis[0][i]=1; } rep(i,0,m) if (__builtin_popcount(cst[i])<=1) { q.push(mp(1,i)); vis[1][i]=1; } vector<array<int,3>> ret; while (!q.empty()) { auto [u,c]=q.front(); q.pop(); auto del=[&](int x,int y) { if (d[x][y]) return; int w=s[x][y]-'A'; //printf("del %d %d\n",x,y); rs[x][w]--; cs[y][w]--; if (rs[x][w]==0) { rst[x]^=(1<<w); if (__builtin_popcount(rst[x])==1&&!vis[0][x]) { q.push(mp(0,x)); vis[0][x]=1; } } if (cs[y][w]==0) { cst[y]^=(1<<w); if (__builtin_popcount(cst[y])==1&&!vis[1][y]) { q.push(mp(1,y)); vis[1][y]=1; } } //puts("cnm"); }; if (u==0&&rst[c]==0) continue; if (u==1&&cst[c]==0) continue; if (u==0) { int let=__builtin_ctz(rst[c]); ret.pb({0,c,let}); //VI rr(all(rs[c][let])); rep(x,0,m) del(c,x); } else { int let=__builtin_ctz(cst[c]); ret.pb({1,c,let}); //VI cr(all(cs[c][let])); rep(x,0,n) del(x,c); } } printf("%d\n",SZ(ret)); reverse(all(ret)); for (auto [ty,c,let]:ret) { printf("%c %d %c\n","RK"[ty],c+1,'A'+let); } }  | 
            
        
                    English