/*
  数の10新表現を数学を並び替えることで別の数をつくり、数列を作って、その周期を調べる
*/

#include <stdio.h>
#define MAX_L 6 // 最大の桁数

#define SHOJUN 1 // 昇順
#define KOJUN 0 // 降順

#define MAX_I (20+1) // 問題で提示された周期の上限+1

/* バブルソート: type==SHOJUNで小さい順、type==KOJUNで大きい順 */
void bubble_sort(int *num, int size, int type) { // 配列、配列の大きさ、並べ方の種類
  int i, j;

  /* 前後の数の大小を比較して交換を繰り返すことで整列する */
  for (i=1; i<=size-1; i++) { 
    for (j=0; j<=size-1-i; j++) {
      if ((num[j] > num[j+1] && type == SHOJUN) // 指定された並び方にしたがい
	  || (num[j] < num[j+1] && type == KOJUN)) {
	int tmp = num[j]; // 値を交換する
	num[j] = num[j+1];
	num[j+1] = tmp;
      }
    }
  }
}


/* 配列をコピー */
void copy_array(int *from, int *to, int size) { // コピー元、コピー先、配列の大きさ
  int i;
  
  for (i=0; i<size; i++)
    to[i] = from[i];
}

/* 各桁の数字が入った配列を整数にして返す（1の桁が0番目の要素） */
int array_to_int(int *num, int size) { // 配列、 配列の大きさ
  int i;
  int sum=0; 

  /* 最上位の桁から、桁の値を加算し10倍するのを繰り返すことで、配列が表す整数を求める */
  for (i=size-1; i>0; i--) {
    sum += num[i];
    sum *= 10;
  }
  sum += num[0]; // 最後に1の桁の値を加える

  return sum;
}

int main(void) {
  int a_0; // 最初の整数
  int L; // 桁数

  int a[MAX_I]; // 得られた数列
  int a_n[MAX_L]; // 数列の一つの数を配列で表見したもの

  int max_array[MAX_L], max; // 数字を並び替えたときの最大の数と配列表現
  int min_array[MAX_L], min; // 数字を並び替えたときの最小の数と配列表現

  int result;
  int i;
  int count; // 数列の番号
  
  while (scanf("%d %d", &a_0, &L) != EOF) { // 数字と桁数を読み込む
    if (a_0 == 0 && L == 0) // 終了判定
      break;

    a[0] = a_0; // 数列の0番目は読み込んだ値
    result = a_0; 
    
    /* 一つまえの数列の並び替え、その最大と最小の値の差を求めて次の数にし、その数列の周期を求める */
    for (count=1; count<MAX_I; count++) {
      /* 読み込んだ値を配列表現にする */
      for (i=0; i<L; i++) {  
	a_n[i] = result % 10; // 1の桁から順番に、桁の数字を配列に格納
	result /= 10; 
      }

      /* 数列の桁ごとの値を配列に入れ、並び替えて、最大と最小を求める */
      /* 最大の数を求める */
      copy_array(a_n, max_array, L); 
      bubble_sort(max_array, L, SHOJUN);
      max = array_to_int(max_array, L);

      /* 最小の数を求める */
      copy_array(a_n, min_array, L);
      bubble_sort(min_array, L, KOJUN);      
      min = array_to_int(min_array, L);
      
      result = max - min; // 差を求める

      /* 今までの数列に今求めた新しい数列の値があるか調べる */
      for (i=0; i<count; i++)
	if (a[i] == result)
	  break; // 見つかったら i < count, 見つからなかったらi==countになっている

      if (i != count) { // 今までの数列に今求めた新しい数列の値があったら、表示してループを抜ける 
	printf("%d %d %d\n", i, result, count-i);
	break;
      } else { // なかったら、数列を表す配列に値を代入
	a[count] = result;
      }
    }
  }
	   
  return 0;
}