1 #include <iostream>
2 #include <queue>
3 #include <cstdio>
4 #include <cstring>
5 using namespace std;
6
7 struct node{
8 int cur, step;
9 }now, Next;
10 int vis[10001], star, finish, prime[10001] = { 0, 0, 1 };
11
12 void init(){
13 for (int i = 2; i < 10001; i++){
14 if (!prime[i]){
15 for (int j = 2; i*j < 10001; j++)
16 prime[i*j] = 1;
17 }
18 }
19 }
20
21 int bfs(){
22 queue<node> Q;
23 vis[star] = 1;
24 now.cur = star, now.step = 0;
25 Q.push(now);
26 while (!Q.empty()){
27 int i, j;
28 char num[5];
29 now = Q.front();
30 Q.pop();
31 if (now.cur == finish) return now.step;
32 for (i = 0; i < 4; i++){
33 sprintf(num, "%d", now.cur);
34 for (j = 0; j < 10; j++){
35 if (j == 0 && i == 0)
36 continue;
37 if (i == 0)
38 Next.cur = j * 1000 + (num[1] - '0') * 100 + (num[2] - '0') * 10 + (num[3] - '0');
39 else if (i == 1)
40 Next.cur = j * 100 + (num[0] - '0') * 1000 + (num[2] - '0') * 10 + (num[3] - '0');
41 else if (i == 2)
42 Next.cur = j * 10 + (num[0] - '0') * 1000 + (num[1] - '0') * 100 + (num[3] - '0');
43 else if (i == 3)
44 Next.cur = j + (num[0] - '0') * 1000 + (num[1] - '0') * 100 + (num[2] - '0') * 10;
45 if (!prime[Next.cur] && !vis[Next.cur])
46 {
47 Next.step = now.step + 1;
48 vis[Next.cur] = 1;
49 Q.push(Next);
50 }
51 }
52 }
53 }
54 return -1;
55 }
56
57 int main(){
58 int t, ans;
59 cin >> t;
60 init();
61 while (t--){
62 cin >> star >> finish;
63 memset(vis, 0, sizeof(vis));
64 ans = bfs();
65 if (ans == -1) cout << "Impossible\n";
66 else cout << ans << endl;
67 }
68 return 0;
69 }