#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXN 100
#define MAXLEN 100

int data[100];
int dataPos;

int xlen;
int xlenLimit;
int N;


int xcomp (const void *a, const void *b)
{
  return *(int*)a - *(int*)b;
}

/* A + B = N ... musi platit C*11 + 2*D = N, kde  */

void check (int B, int A, int shift, int div) {
  int a = A * shift + div;
  int b = B * shift + div;

  if (A == 0)
    return;

  if (a+b == N) {
    data [dataPos ++] = a; 
  } else
    printf ("%d + %d != %d\n", a,b,N);

}

int main (void) {

  char s[100];
  int last, count;

  //while 
  {
	  scanf ("%d", &N);
    int p;
    int i;

    sprintf (s, "%d", N);
    xlen = strlen (s);
    xlen--;

    xlenLimit = 1;
    for (p = 0; p < xlen; p++)
      xlenLimit *= 10;

    dataPos = 0;

    if (N % 2) {
      if (N % 11 != 10)
        check (N / 11, (N / 11) * 10  + N % 11, 1, 0);
    } else {

      if (N % 11 != 10 || N == 10)
        check (N / 11, (N / 11) * 10  + N % 11, 1, 0);

      for (p = 10; p < N; p *= 10) {
        int q;

        q = N / p;
        if (q % 11 != 10 || q == 10)
          check (q / 11, (q/11)*10 + q%11, p, (N%p) / 2);
        
        q = (N - p)/ p;
        if (q % 11 != 10 || q == 10)
          check (q / 11, (q/11)*10 + q%11, p, (N%p + p) / 2);
      }
    }

    qsort (data, dataPos, sizeof(int), xcomp);

    last = -1234;
    count = 0;

    for (i = 0 ; i < dataPos ; i++) {
      if (data[i] == last)
        continue;
      last = data[i];
      count ++;
    }

    printf ("%d\n", count);

    last = -1234;

    for (i = 0 ; i < dataPos ; i++) {
      if (data[i] == last)
        continue;
      last = data[i];

      if (data[i] >= xlenLimit)
        printf ("%d + %0*d = %d\n", data[i], xlen, N - data[i], N);
      else
        printf ("%d + %0*d = %d\n", data[i], xlen - 1, N - data[i], N);
    }

  }

  return 0;
  
}
