#include<iostream> using namespace std; const int size = 10000; const int s10 = 1000; int prime[size]; int hash[size-s10]; int head, tail, st, en; const int Go[4] = {1000,100,10,1}; const int GoGo[4] = {10000,1000,100,10}; struct node { int val; int step; }q[size - s10]; void GetPrime() { int sq = 100, i, j; memset(prime, 0, sizeof(prime)); for (i = 1001; i < size; i++) { for (j = 2; j < sq; j++) if(i % j == 0) break; if (j == sq) prime[i] = 1; } } int Bfs() { int i,j; if (q[head].val == en) return q[head].step; tail++; while (head < tail && tail < size - s10) { for (i = 0; i < 4; i++) { q[tail].val = q[head].val + Go[i]; while(q[tail].val/GoGo[i] == q[head].val/GoGo[i]) { if (q[tail].val >= 1000 && q[tail].val < size && !hash[q[tail].val-s10] && prime[q[tail].val]) { q[tail].step = q[head].step+1; hash[q[tail].val - s10] = 1; if (q[tail].val == en) return q[tail].step; q[tail+1].val = q[tail].val + Go[i]; tail++; } else { q[tail].val += Go[i]; } } q[tail].val = q[head].val - Go[i]; while (q[tail].val/GoGo[i] == q[head].val/GoGo[i]) { if (q[tail].val >= 1000 && q[tail].val < size && !hash[q[tail].val-s10] && prime[q[tail].val]) { q[tail].step = q[head].step+1; hash[q[tail].val - s10] = 1; if (q[tail].val == en) { return q[tail].step; } q[tail+1].val = q[tail].val - Go[i]; tail++; } else q[tail].val -= Go[i]; } } head++; } return -1; } int main() { int Case; GetPrime(); cin >> Case; while (Case--) { cin >> st >> en; if (!prime[st]||!prime[en]) { cout << "Impossible" << endl; continue; } memset(hash, 0, sizeof(hash)); head = tail = 0; hash[st-s10] = 1; q[head].val = st; q[head].step = 0; int temp = Bfs(); if (temp < 0) cout << "Impossible" << endl; else cout << temp << endl; } return 0; }