/*
* POJ_3126.cpp
*
* Created on: 2013年11月7日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
int k;//当前素数
int step;//路径长度
};
node h[100000];//队列
int p[10010];//素数表
/**
* x: 初始素数
* y: 目标素数
* s[x] = a: 到达素数x的最短路径为a
*/
int x,y,tot,s[10010];
void make(int n){//产生素数表
memset(p,0,sizeof(p));
p[0] = 1;
p[1] = 1;
int i,j;
for(i = 2 ; i <= n ; ++i){
if(!p[i]){
for(j = i*i ; j <= n ;j += i){
p[j] = 1;
}
}
}
}
int change(int x,int i,int j){//将x的第i位改成j
if(i == 1){
return (x/10)*10 + j;
}else if(i == 2){
return (x/100)*100 + x%10 + j*10;
}else if(i == 3){
return (x/1000)*1000 + x%100 + j*100;
}else if(i == 4){
return (x%1000) + j*1000;
}
}
int main(){
make(9999);
scanf("%d",&tot);
while(tot--){
scanf("%d%d",&x,&y);
h[1].k = x;
h[1].step = 0;
int l = 1;
int r = 1;
memset(s,100,sizeof(s));//一开始将到达一个素数的路径设成一个很大的值
int ans = -1;
while(1){
if(h[l].k == y){//如果当前素数 == 目标素数
ans = h[l].step;
break;
}
/**
* tk: 当前素数
* ts: 到达素数tk的路径长度
*/
int tk,ts;
int i,j;
for(i = 1 ; i <= 4 ; ++i){//搜索每一种情况
for(j = 0 ; j <= 9 ; ++j){
if(!(j == 0 && i == 4)){
tk = change(h[l].k,i,j);
if(p[tk]){
continue;
}
ts = h[l].step + 1;
if(ts >= s[tk]){
continue;
}
if(tk == y){
ans = ts;
break;
}
s[tk] = ts;
r++;
h[r].k = tk;
h[r].step = ts;
}
}
}
if(l == r || ans >= 0){//如果队列空||得到目标素数
break;
}
l++;//队首元素真正出队
}
if(ans >= 0){
printf("%d\n",ans);
}else{
printf("Impossible\n");
}
}
return 0;
}