#include<iostream>
#include<fstream>
#include<vector>
#include<map>
#include<algorithm>
#include<set>
#include <cmath>
#include<string.h>
#include <stdio.h>
#include <unordered_map>
#include <queue>
#include<climits>




using namespace std;
#define ll long long
#define clr(x) memset(x, 0, sizeof(x))
#define tcase ll t;cin>>t;while(t--)
#define all(v) v.begin(),v.end()
#define inarray(a,n) for(ll i=0;i<n;i++){cin>>a[i];}
#define prarr(a,n) for(ll i=0;i<n;i++){cout<<a[i]<<" ";}cout<<endl;
#define GCJ ll t;cin>>t;for(ll H=1;H<=t;H++){cout<<"CASE #"<<H<<": ";solve();}


map<char, bool>exists;
map<char, int>lb;


void check(int x, string s)
{
    vector<int>v;
    while(x>=10)
    {
        v.push_back(x%10);
        x/=10;
    }
    v.push_back(x);
    if(v.size()!=s.size())
    {
        return;
    }
    reverse(all(v));
    for(int i=0;i<v.size();i++)
    {
        if(!exists[s[i]])
        {
            exists[s[i]]=true;
            lb[s[i]]=v[i];
        }
        else
        {
            lb[s[i]]=min(lb[s[i]], v[i]);
        }

    }
}


void solve()
{
    
    lb.clear();
    exists.clear();
    int u;
    cin>>u;
    string s;
    s.resize(10);
    

    for(int I=0;I<10000;I++)
    {
        
        //cout<<I<<endl;
        int q;
        string r;
        cin>>q>>r;
        
        
        
        
        
        
        for(int i=1;i<=q;i++)
        {
            check(i, r);
        }
        
    }
    
    //cout<<"k"<<endl;
   
    
    for(int i=0;i<26;i++)
    {
        
        
        char c=i+'A';
        if(exists[c])
        {
            cout<<c<<" "<<lb[c]<<endl;
            s[lb[c]]=c;
        }
    }
    cout<<s<<endl;
    
    
}


int main()
{
    GCJ
}




















