#include<bits/stdc++.h>
using namespace std;
struct ans{
int shuzihe;
int shu;
};
int gcd(int a,int b){
if(a%b==0) return b;
else return gcd(b,a%b);
}
bool isprime(int a){
if(a<=2)
return false;
for(int i=2;i*i<=a;i++)
{
if(a%i==0)
return false;
}
return true;
}
//求一个正整数的各位数字之和
int dsum(int n){
int sum=0;
while(n!=0){
sum=sum+n%10;
n=n/10;
}
return sum;
}
bool cmp(ans a,ans b){
if(a.shuzihe!=b.shuzihe)
return a.shuzihe<b.shuzihe;
else return a.shu<b.shu;
}
int main(){
int N;
cin>>N;
int k,m;
//对每一对k和m,如果解不唯一,则每组解存放在结构体c中
//ans c[10000]={0};
for(int i=0;i<N;i++){
//memset(c,0,sizeof(c));
ans c[10000];
cin>>k>>m;
//最小的k位正整数
int min=pow(10,k-1);
//最大的k位正整数
long long max=min*10-1;
int count=0;
cout<<"Case "<<i+1<<endl;
for(int j=min+9;j<=max;j=j+10){//j就是A
int num=0;
if(dsum(j)==m){//如果j(A)的各位数字之和是m
if(isprime(gcd(dsum(j+1),m))){//j+1的各位数字之和(n)和m的最大公约数是大于2的素数
c[count].shuzihe=dsum(j+1);//存放n
c[count].shu=j;//存放A
count++;
}
}
}
if(count==0) printf("No Solution\n");
sort(c,c+count,cmp);
for(int j=0;j<count;j++){
printf("%d %d\n",c[j].shuzihe,c[j].shu);
}
}
return 0;
}