#include <stdio.h>

/* 整数を入れ替える */
void swap(int *a, int *b){
	int c;
	c = *b;
	*b = *a;
	*a = c;
}

/* 配列を複製する */
/*
void copy(int *d, const int *s, int length){
	int i;
	for (i = 0; i < length; i++){
		d[i] = s[i];
	}
}
*/

/* 与えられた配列を逆順にして複製する */
void copyRverse(int *d, const int *s, int length){
	int i;
	for (i = 0; i < length; i++){
		d[i] = s[length-1-i];
	}
}

/* 整数配列を昇順に並び替える */
void sortAscending(int *array, int length){
	int i, j;
	for (i = 0; i < length - 1; i++){
		for (j = 0; j < length - 1 - i; j++){
			if (array[j] > array[j+1]){
				swap(&array[j], &array[j+1]);
			}
		}
	}
}

/* 整数を 1 桁ごとに分けて配列化する */
int* toMulti(int *m, int a, int length){
	int i;
	for (i = 0; i < length; i++){
		m[i] = a % 10;
		a /= 10;
	}
	return m;
}

/* 配列化された整数を int 型に変換する */
int toSingle(const int *m, int length){
	int a = 0;
	int i;
	for (i = 0; i < length; i++){
		a *= 10;
		a += m[length-1-i];
	}
	return a;
}

int main(void){
	int a[21];
	int l;
	int max[6];
	int min[6];
	int i, j;

	while(scanf("%d %d", &a[0], &l) == 2){
		if (a[0] == 0 && l == 0){
			break;
		}

		for (i = 1; i <= 20; i++){
			toMulti(max, a[i-1], l);
			sortAscending(max, l);
			copyRverse(min, max, l);
			/* 次の整数 ai を計算する */
			a[i] = toSingle(max, l) - toSingle(min, l);
			/* printf("    a[%2d]: %6d - %6d = %d\n", i, toSingle(max, l), toSingle(min, l), a[i]); */
			/* ai = aj を満たす j を探す */
			for (j = 0; j < i; j++){
				if (a[i] == a[j]){
					break;
				}
			}
			if (j < i){
				break;
			}
		}

		/* j の値, ai の値, i - j の値 */
		printf("%d %d %d\n", j, a[i], i - j);
	}

    return 0;
}