#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;
}
