#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
queue<int>q;
int prime[9999],k,pre[9999];
int data[9999];
void getPrime(){
memset(prime,0,sizeof prime);
bool flag;
for(int i=1001;i<10000;i+=2){
flag = true;
for(int j=2;j<=sqrt((double)i);j++){
if(i%j==0)flag = false;
}
if(flag)prime[i] = 1;
}
}
//bool isSwap(int a,int b){
// if(a/10==b/10)return true;
// if(a%10==b%10&&a/100==b/100)return true;
// if(a%100==b%100&&a/1000==b/1000)return true;
// if(a%1000==b%1000)return true;
// return false;
//}
void swapPrime(int a,int b){
int i,j,t;
memset(data,-1,sizeof data);
q.push(a);
data[a] = 0;
while(!q.empty()){
t = q.front();q.pop();
if(t==b){
printf("%d\n",data[t]);
while(!q.empty()){
q.pop();
}
return;
}
for(i=1;i<10;i+=2){
j = t-t%10+i;
if(prime[j]==1&&data[j]==-1){
data[j] = data[t]+1;
q.push(j);
}
}
for(i=0;i<10;i++){
j = t/100*100+t%10+i*10;
if(prime[j]==1&&data[j]==-1){
data[j] = data[t]+1;
q.push(j);
}
}
for(i=0;i<10;i++){
j = t/1000*1000+t%100+i*100;
if(prime[j]==1&&data[j]==-1){
data[j] = data[t]+1;
q.push(j);
}
}
for(i=1;i<10;i++){
j = t%1000+i*1000;
if(prime[j]==1&&data[j]==-1){
data[j] = data[t]+1;
q.push(j);
}
}
}
}
using namespace std;
int main(){
int a,b,n;
scanf("%d",&n);
getPrime();
while(n--){
scanf("%d%d",&a,&b);
swapPrime(a,b);
}
return 0;
}