#include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
int prime[10000],b,ok;
int vis[10000];
struct node{
int k;
int step;
};
queue<node> q;
int bfs(){
node temp,next;
int x,y;
while(!q.empty()){
temp=q.front();
// cout<<temp.k<<" "<<temp.step<<endl;
q.pop();
x=temp.k;
//换个位
y=x%10;
for(int i=0;i<=9;i++){
if(i!=y){
int u=x/10*10+i;
if(u==b) {ok=1;break;}
if(prime[u]==1&&vis[u]==0){
// cout<<u<<" 个"<<endl;
vis[u]=1;
next.k=u;
next.step=temp.step+1;
q.push(next);
}
}
}
//换十位
y=x%100/10;
for(int i=0;i<=9;i++){
if(i!=y){
int u=x/100*100+i*10+x%10;
if(u==b) {ok=1;break;}
if(prime[u]&&vis[u]==0){
// cout<<u<<" 十"<<endl;
vis[u]=1;
next.k=u;
next.step=temp.step+1;
q.push(next);
}
}
}
//换百位
y=x%1000/100;
for(int i=0;i<=9;i++){
if(i!=y){
int u=x/1000*1000+i*100+x%100;
if(u==b) {ok=1;break;}
if(prime[u]&&vis[u]==0){
// cout<<u<<" 百"<<endl;
vis[u]=1;
next.k=u;
next.step=temp.step+1;
q.push(next);
}
}
}
//换千位
y=x/1000;
for(int i=1;i<=9;i++){
if(i!=y){
int u=i*1000+x%1000;
if(u==b) {ok=1;break;}
if(prime[u]&&vis[u]==0){
// cout<<u<<" 千"<<endl;
vis[u]=1;
next.k=u;
next.step=temp.step+1;
q.push(next);
}
}
}
if(ok) {break;}
}
return temp.step+1;
}
int main(){
int t,a,ff;
memset(prime,0,sizeof(prime));
for(int i=1000;i<10000;i++){
double r=sqrt(i);
ff=0;
for(int j=2;j<=r;j++){
if(i%j==0) {ff=1;break;}
}
if(ff==0) {prime[i]=1;}
}
cin>>t;
while(t--){
cin>>a>>b;
if(a==b){cout<<0<<endl;continue;}
while(!q.empty()) q.pop();
ok=0;
memset(vis,0,sizeof(vis));
node a1;
a1.k=a;
a1.step=0;
q.push(a1);
vis[a]=1;
int uu=bfs();
cout<<uu<<endl;
}
return 0;
}