#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <utility>
#include <queue>
#include <stack>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#include <array>
#include <set>
#include <climits>
#include <sstream>
#include <iomanip>
#include <cassert>
#include <bitset>
#include <numeric>
using namespace std;
using namespace __gnu_pbds;
typedef tree< // find_by_order & order_of_key
        int ,
        null_type ,
        less<int> ,
        rb_tree_tag ,
        tree_order_statistics_node_update 
> new_set;
#define MOD 1000000007
#define MAXN 30*60+10
int main(void){
#ifdef HELL_JUDGE
    freopen("input","r",stdin);
    freopen("output","w",stdout);
    freopen("error","w",stderr);
#endif 

    int t; cin>>t;
    for(int tt=1;tt<=t;++tt){
        printf("Case #%d: " , tt);
        int n; cin>>n;
        vector<pair<int,int>>timing(n);
        array<char , MAXN>cam , jam;
        fill(cam.begin() , cam.end() , 'X');
        fill(jam.begin() , jam.end() , 'X');
        bool can_be_solved = true;
        for(int i=0;i<n;++i){
            cin>>timing[i].first>>timing[i].second;
            int u = timing[i].first;
            int v = timing[i].second;
            if(none_of(cam.begin()+u,cam.begin()+v,[](char ch){return ch=='C';})){
                fill(cam.begin()+u,cam.begin()+v,'C');
            }else if(none_of(jam.begin()+u,jam.begin()+v,[](char ch){return ch=='J';})){
                fill(jam.begin()+u,jam.begin()+v,'J');
            }else{
                can_be_solved = false;
            }
        }
        // output
        if(can_be_solved==false){
            puts("IMPOSSIBLE");
        }else{
            for(int i=0;i<n;++i){
                int u = timing[i].first;
                int v = timing[i].second;
                if(none_of(cam.begin()+u,cam.begin()+v,[](char ch){return ch=='X';})){
                    cout<<"C";
                    fill(cam.begin()+u,cam.begin()+v,'X');
                }else if(none_of(jam.begin()+u,jam.begin()+v,[](char ch){return ch=='X';})){
                    cout<<"J";
                    fill(jam.begin()+u,jam.begin()+v,'X');
                }
            }
            puts("");
        }

    }
    return 0;
}