#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
int sum_n (int n){ //подсчёт суммы цифер в числе
int res = n/1000 + (n%1000-n%100)/100 + (n%100-n%10)/10 + n%10;
return res;
}
bool was [10000]; //массив использованных вершин.
int vertex[10000]; //подсчёт кол-ва пройденных рёбер..
queue<int> q; //очередь для BFS
//BFS
void bfs (int start, int finish){
if (start==finish){ //если мы сразу попали в нужную вершину - выходим из программы.
cout << 0 << endl;
return;
}
else {
for (int i=0; i<10000; i++){ //предположим, что расстояние до любой вершины = 1
vertex[i]=1;
}
q.push (start); //будем рассматривать каждую вершину
was[start] = true;
while (!q.empty()){
int tmp = q.front(); //рассматриваемая вершина
q.pop();
int tmp1 = tmp;
tmp1 *= 3; //"ребёнок" рассматриваемой вершины, со значением родителбской вершины *3.
if (!was[tmp1]){
if (tmp1 == finish){//если финиш, то выводим длину пути до вершины.
cout << vertex[tmp] << endl;
return;
}
else if (tmp1 < 10000 && tmp1>=0){
was[tmp1] = true;//иначе помечаем вершину, как пройденную и засовываем её в очередь на рассмотрение
q.push(tmp1);
vertex[tmp1]=vertex[tmp]+1;//и прибавляем 1 к длине пути.
}
}
//действия повторяются для других операций.
tmp1=tmp;
tmp1 += sum_n(tmp1);
if (!was[tmp1]){
if (tmp1 == finish){
cout << vertex[tmp] << endl;
return;
}
else if (tmp1 < 10000 && tmp1>=0){
was[tmp1] = true;
vertex[tmp1]=vertex[tmp]+1;
q.push(tmp1);
}
}
tmp1=tmp;
tmp1 -= 2;
if (!was[tmp1]){
if (tmp1 == finish){
cout << vertex[tmp] << endl;
return;
}
else if (tmp1 < 10000 && tmp1>=0){
was[tmp1] = true;
vertex[tmp1]=vertex[tmp]+1;
q.push(tmp1);
}
}
}
}
}
int main() {
int a, b;
cin >> a >> b; //ввод начала и конца
bfs (a, b);//процедура выполнения
return 0;
}