#include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for(int i=0; i<int(n); ++i)
#define RER(i,l,r) for(int i=l; i<=int(r); ++i)
#define out(x) cout<<#x"="<<(x)<<endl
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
#define pb push_back
#define X first
#define Y second
#define mp make_pair
//#define __debug
int a[123][123], b[2][2];
int &A(int id, int i, int j){
    return id ? a[j][i] : a[i][j];
}
int n, m, sz[2];
vpii ans;
void rev(int axis, int id){
    if(axis==0)reverse(a[id], a[id]+m);
    else {
        for(int i=0, j=n-1; i<j; ++i, --j)
            swap(a[i][id], a[j][id]);
    }
}
int x[2], y[2];
void rev1(int axis, int i){
    if (axis==0) swap(b[i][0], b[i][1]);
    else swap(b[0][i], b[1][i]);
    ans.pb(mp(axis, axis?y[i]:x[i]));
    //rev(axis, xx);
}
bool check(int axis, int id){
    if(axis==0){
        REP(i,m)if(a[id][i]!=id*m+i)
            return 0;
    } else {
        REP(i,n)if(a[i][id]!=i*m+id)
            return 0;
    }
    return 1;
}
void rot(int pos, int dir){
    rev1(dir, pos);
    rev1(dir^1, pos);
    rev1(dir, pos);
    rev1(dir^1, pos);
}
bool gao(int X0, int X1, int Y0, int Y1, int r, int c){
    x[0]=X0; x[1]=X1;
    y[0]=Y0; y[1]=Y1;
    int cnt[4]={0};
    REP(i,2)REP(j,2){
        b[i][j]=-1;
        REP(u,2)REP(v,2){
            if(a[x[i]][y[j]]==x[u]*m+y[v])
                b[i][j]=u*2+v;
        }
        if(b[i][j]==-1)return 0;
        cnt[b[i][j]]++;
    }
    REP(i,4)assert(cnt[i]==1);
    if(b[1][1]==0)rot(1,0);
    if(b[0][0]!=0){
        if(b[0][1]==0)rot(0,0);
        else rot(0,1);
        assert(b[0][0]==0);
    }
    if(c==0){
        if(b[0][1]!=1){
            if(b[1][0]==1)rot(1,1);
            else rot(1,0);
            assert(b[0][1]==1);
        }
        if(b[1][0]!=2){
            rev(0, x[1]);
            rev1(0, 1);
        }
    } else {
        if(b[1][0]!=2){
            if(b[0][1]==2)rot(1,0);
            else rot(1,1);
            assert(b[1][0]==2);
        }
        if(b[0][1]!=1){
            if(r)return 0;
            rev(1, y[1]);
            rev1(1, 1);
        }
    }
    REP(i,2)REP(j,2)assert(b[i][j]==i*2+j);
    return 1;
}
int main(){
    int T;
    scanf("%d",&T);
    REP(tt,T){
        ans.clear();
        scanf("%d%d",&m,&n);
        bool ok=1;
        sz[0]=m;
        sz[1]=n;
        REP(i,n)REP(j,m){
            scanf("%d",a[i]+j);
            a[i][j]--;
        }
        if(n&1){
            int id=n/2;
            if(a[id][0]!=id*m){
                rev(0,id);
                ans.pb(mp(0, id));
            }
            if(!check(0, id))ok=0;
        }
        if(m&1){
            int id=m/2;
            if(a[0][id]!=id){
                rev(1,id);
                ans.pb(mp(1, id));
            }
            if(!check(1, id))ok=0;
        }
        int x0=n/2-1, x1=(n+1)/2, y0=m/2-1, y1=(m+1)/2;
        for(int i=0; ok && i<n/2; ++i)
            for(int j=0; ok && j<m/2; ++j)
                ok = ok && gao(x0-i,x1+i,y0-j,y1+j,i,j);
        if(!ok)puts("IMPOSSIBLE");
        else {
            //REP(i,n)REP(j,m)assert(a[i][j]==i*m+j);
            printf("POSSIBLE %d", (int)ans.size());
            REP(i,ans.size())
                printf(" %c%d", ans[i].X?'C':'R', ans[i].Y+1);
            putchar('\n');
        }
    }
}
