#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 1000
using namespace std;

typedef pair<int,int> PII;
map<int,int> mp;
map<int,int>::iterator it;
vector<PII> Nico[10];
int n,m;
int a[MAXN][MAXN];
int sum;
queue<PII> Q;
int pre[5000],pro[5000];

void dfs(int a, int b, int c, int d, int e,int fa,int opt){
	if ((mp.find(d+5*c+25*b+125*a)!=mp.end())&&(mp[d+5*c+25*b+125*a]<=e))
		return ;
	pre[d+5*c+25*b+125*a]=fa;
	pro[d+5*c+25*b+125*a]=opt;
	mp[d+5*c+25*b+125*a]=e;
	int tmp=d+5*c+25*b+125*a;
	dfs(a,c,d,b,e+1,tmp,1);
	dfs(a,d,b,c,e+1,tmp,2);
	dfs(b,d,c,a,e+1,tmp,3);
	dfs(d,a,c,b,e+1,tmp,4);
	dfs(c,a,b,d,e+1,tmp,5);
	dfs(b,c,a,d,e+1,tmp,6);
	dfs(d,b,a,c,e+1,tmp,7);
	dfs(c,b,d,a,e+1,tmp,8);
}

void Fill(int x,int i,int j){
//	cout<<x<<' '<<pre[x]<<endl;
//	int xx=x;
//	cout<<xx/125<<' '<<(xx%125)/25<<' '<<xx%25/5<<' '<<xx%5<<endl;
	if (x==0)
		return;
	else{
		if (pro[x]){
		rep(ii,1,4){
			PII now=Nico[pro[x]][1];
			if ((now.first==0)&&(now.second==0)) Q.push(PII(0,i));
			if ((now.first==0)&&(now.second==1)) Q.push(PII(0,n+1-i));
			if ((now.first==1)&&(now.second==0)) Q.push(PII(1,j));
			if ((now.first==1)&&(now.second==1)) Q.push(PII(1,m+1-j));
			now=Nico[pro[x]][0];
			if ((now.first==0)&&(now.second==0)) Q.push(PII(0,i));
			if ((now.first==0)&&(now.second==1)) Q.push(PII(0,n+1-i));
			if ((now.first==1)&&(now.second==0)) Q.push(PII(1,j));
			if ((now.first==1)&&(now.second==1)) Q.push(PII(1,m+1-j));
		}
		}
		Fill(pre[x],i,j);
	}
}

void work(char ch, int x){
	int tmp;
	if (ch=='R'){
		rep(i,1,m/2){
			tmp=a[x][i];
			a[x][i]=a[x][m+1-i];
			a[x][m+1-i]=tmp;
		}
	}
	else{
		rep(i,1,n/2){
			tmp=a[i][x];
			a[i][x]=a[n+1-i][x];
			a[n+1-i][x]=tmp;
		}
	}
}

int main(){
	mp.clear();
	sum=0;
	dfs(1,2,3,4,1,0,0);
	dfs(1,2,4,3,11,0,0);
	Nico[1].push_back(PII(0,1));
	Nico[1].push_back(PII(1,1));
	Nico[2].push_back(PII(1,1));
	Nico[2].push_back(PII(0,1));
	Nico[3].push_back(PII(0,0));
	Nico[3].push_back(PII(1,1));
	Nico[4].push_back(PII(1,1));
	Nico[4].push_back(PII(0,0));
	Nico[5].push_back(PII(0,0));
	Nico[5].push_back(PII(1,0));
	Nico[6].push_back(PII(1,0));
	Nico[6].push_back(PII(0,0));
	Nico[7].push_back(PII(0,1));
	Nico[7].push_back(PII(1,0));
	Nico[8].push_back(PII(1,0));
	Nico[8].push_back(PII(0,1));
	for(it = mp.begin();it!=mp.end();it++){
		int x =(it->first);
		/*cout<<(it->second)<<endl;
		cout<<x/125<<' ';
		x%=125;
		cout<<x/25<<'\n';
		x%=25;
		cout<<x/5<<' ';
		x%=5;
		cout<<x<<'\n'<<endl;
		sum++;*/
	}
//	cout<<sum<<endl;
	int T;
	cin>>T;
	while(T--){
	//	Q.clear();
		scanf("%d%d",&m,&n);
		rep(i,1,n)
		rep(j,1,m)
				scanf("%d",&a[i][j]);
		int ans=0;
		int tmp[5];
	//	puts("!!");
		rep(i,1,n/2)
		rep(j,1,m/2){
			int A=(a[i][j]<=a[i][j])+(a[i][m+1-j]<=a[i][j])+(a[n+1-i][j]<=a[i][j])+(a[n+1-i][m+1-j]<=a[i][j]);
			int B=(a[i][j]<=a[i][m+1-j])+(a[i][m+1-j]<=a[i][m+1-j])+(a[n+1-i][j]<=a[i][m+1-j])+(a[n+1-i][m+1-j]<=a[i][m+1-j]);
			int C=(a[i][j]<=a[n+1-i][j])+(a[i][m+1-j]<=a[n+1-i][j])+(a[n+1-i][j]<=a[n+1-i][j])+(a[n+1-i][m+1-j]<=a[n+1-i][j]);
			int D=(a[i][j]<=a[n+1-i][m+1-j])+(a[i][m+1-j]<=a[n+1-i][m+1-j])+(a[n+1-i][j]<=a[n+1-i][m+1-j])+(a[n+1-i][m+1-j]<=a[n+1-i][m+1-j]);
			tmp[1]=(i-1)*m+j;
			tmp[2]=(i-1)*m+m+1-j;
			tmp[3]=(n-i)*m+j;
			tmp[4]=(n-i)*m+m+1-j;
		//	cout<<"##"<<i<<' '<<j<<endl;
		//	cout<<A<<' '<<B<<' '<<C<<' '<<D<<endl;
			if ((tmp[A]!=a[i][j])||(tmp[B]!=a[i][m+1-j])||(tmp[C]!=a[n+1-i][j])||(tmp[D]!=a[n+1-i][m+1-j])) {
				ans=-1; goto END;
			}
			//if ()
			if (mp[D+5*C+25*B+125*A]>=10){
				ans+=8*(mp[D+5*C+25*B+125*A]-11);
				a[i][j]=tmp[1];
				a[i][m+1-j]=tmp[2];
				a[n+1-i][j]=tmp[4];
				a[n+1-i][m+1-j]=tmp[3];
				Fill(D+5*C+25*B+125*A,i,j);
			}
			else{
				ans+=8*(mp[D+5*C+25*B+125*A]-1);
			//	puts("!!");
			// 	cout<<i<<' '<<j<<endl;
				a[i][j]=tmp[1];
				a[i][m+1-j]=tmp[2];
				a[n+1-i][j]=tmp[3];
				a[n+1-i][m+1-j]=tmp[4];
				Fill(D+5*C+25*B+125*A,i,j);
			//	puts("##");
			}
		}
		if (n%2==1){
			if (a[n/2+1][1]!=(n/2)*m+1){
				ans++;
				Q.push(PII(0,n/2+1));
				rep(i,1,m/2){
					int tmp=a[n/2+1][i];
					a[n/2+1][i]=a[n/2+1][m+1-i];
					a[n/2+1][m+1-i]=tmp;
				}
			}
			rep(i,1,m)
				if (a[n/2+1][i]!=(n/2)*m+i){
					ans=-1;
					goto END;
				}
		}
		if (m%2==1){
			if (a[1][m/2+1]!=m/2+1){
				ans++;
				Q.push(PII(1,m/2+1));
				rep(i,1,n/2){
					int tmp=a[i][m/2+1];
					a[i][m/2+1]=a[n+1-i][m/2+1];
					a[n+1-i][m/2+1]=tmp;
				}
			}
			rep(i,1,n)
				if (a[i][m/2+1]!=(i-1)*m+m/2+1){
					ans=-1;
					goto END;
				}
		}

		/*
		if (ans==-1)
			printf("IMPOSSIBLE\n");
		else{
			printf("POSSIBLE %d",ans);
			while(!Q.empty()){
				PII now = Q.front();
				Q.pop();
				if (now.first)
					printf(" C");
				else
					printf(" R");
				printf("%d",now.second);
			}
			printf("\n");
		}
*/

		rep(i,(1+n)/2+1,n){
			if (a[i][1]!=(i-1)*m+1){
				ans++;
				Q.push(PII(0,i));
				work('R',i);
			}
		}
		rep(j,1,m){
			if (a[n][j]!=(n-1)*m+j){
				{
					rep(i,(n+1)/2+1,n){
						ans++;
						Q.push(PII(0,i));
						work('R',i);
					}
					ans++;
					Q.push(PII(1,m+1-j));
					work('C',m+1-j);
					rep(i,(n+1)/2+1,n){
						ans++;
						Q.push(PII(0,i));
						work('R',i);
					}
					ans++;
					Q.push(PII(1,m+1-j));
					work('C',m+1-j);
					rep(i,(n+1)/2+1,n){
						ans++;
						Q.push(PII(0,i));
						work('R',i);
					}
					ans++;
					Q.push(PII(1,m+1-j));
					work('C',m+1-j);
					rep(i,(n+1)/2+1,n){
						ans++;
						Q.push(PII(0,i));
						work('R',i);
					}
				}
			}
		}
		rep(j,1,m){
			rep(i,(n+1)/2+1,n)
				if (a[i][j]-a[i-1][j]!=m){
					ans=-1;
					goto END;
				}
		}
		END:
		if (ans==-1){
			printf("IMPOSSIBLE\n");
			while(!Q.empty())
				Q.pop();
		}
		else{
			printf("POSSIBLE %d",ans);
			while(!Q.empty()){
				PII now = Q.front();
				Q.pop();
				if (now.first)
					printf(" C");
				else
					printf(" R");
				printf("%d",now.second);
			}
			printf("\n");
		}
	//	printf("%d %d\n",n,m);
	}
}
