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

struct number
{
  unsigned val[1000];
  unsigned len;
};

char num1[2000], num2[2000], result[2000];
struct number val1, val2, valres;

char obuf[2000];

struct number fibs[3];
struct number *prev_fib = fibs, *act_fib = fibs + 1, *next_fib = fibs + 2;

void add (struct number *a, struct number *b, struct number *c)
{
  unsigned i;
  unsigned prenos = 0;
  unsigned dig;
  struct number *t;

  if (a->len < b->len)
    {
      t = a;
      a = b;
      b = t;
    }

  for (i = 0; i < b->len; i++)
    {
      dig = a->val[i] + b->val[i] + prenos;
      prenos = dig >> 31;
      c->val[i] = dig & (~0u >> 1);
    }

  for (; i < a->len; i++)
    {
      dig = a->val[i] + prenos;
      prenos = dig >> 31;
      c->val[i] = dig & (~0u >> 1);
    }

  if (prenos)
    c->val[i++] = prenos;

  c->len = i;
}

void dec (struct number *a, struct number *b, struct number *c)
{
  unsigned i;
  unsigned prenos = 0;
  unsigned dig;

  if (a->len < b->len)
    exit (1);

  for (i = 0; i < b->len; i++)
    {
      dig = a->val[i] - b->val[i] - prenos;
      prenos = dig >> 31;
      c->val[i] = dig & (~0u >> 1);
    }

  for (; i < a->len; i++)
    {
      dig = a->val[i] - prenos;
      prenos = dig >> 31;
      c->val[i] = dig & (~0u >> 1);
    }

  if (prenos)
    exit (1);

  while (i && c->val[i - 1] == 0)
    i--;
  c->len = i;
}

int lessoreq(struct number *a, struct number *b)
{
  int i;

  if (a->len < b->len)
    return 1;
  if (a->len > b->len)
    return 0;

  for (i = a->len - 1; i >= 0; i--)
    {
      if (a->val[i] < b->val[i])
	return 1;
      if (a->val[i] > b->val[i])
	return 0;
    }

  return 1;
}

void advance_fib (void)
{
  struct number *pr = prev_fib;

  prev_fib = act_fib;
  act_fib = next_fib;
  next_fib = pr;

  add (prev_fib, act_fib, next_fib);
}

void unfib_fib (void)
{
  struct number *pr = next_fib;

  next_fib = act_fib;
  act_fib = prev_fib;
  prev_fib = pr;

  dec (next_fib, act_fib, prev_fib);
}

void init_fib(void)
{
  prev_fib->len = 1; prev_fib->val[0] = 1;
  act_fib->len = 1; act_fib->val[0] = 1;
  next_fib->len = 1; next_fib->val[0] = 2;
}

void fromfib (char *infib, struct number *num)
{
  char *p;

  num->len = 0;
  init_fib ();

  for (p = infib; *p; p++);

  do
    {
      p--;
      if (*p == '1')
	add (num, act_fib, num);

      advance_fib ();
    }
  while (p != infib);
}

void tofib (struct number *num, char *infib)
{
  int afib = 0;

  if (num->len == 0)
    {
      infib[0] = '0';
      infib[1] = 0;
      return;
    }

  init_fib ();
  while (lessoreq (act_fib, num))
    {
      advance_fib ();
      afib++;
    }

  while (num->len)
    {
      unfib_fib ();
      afib--;
      if (lessoreq (act_fib, num))
	{
	  *infib = '1';
	  dec (num, act_fib, num);
	}
      else
	*infib = '0';

      infib++;
    }
  for (; afib > 0; afib--)
    *infib++ = '0';
  *infib = 0;
}

int main(void)
{
  int i, l;

  while (1)
    {
      if (scanf ("%s%s", num1, num2) != 2)
	return 0;

      fromfib (num1, &val1);
      fromfib (num2, &val2);
      add (&val1, &val2, &valres);

      tofib (&val1, num1);
      tofib (&val2, num2);
      tofib (&valres, result);

      l = strlen (num1);
      if (l < strlen (num2))
	l = strlen (num2);
      if (l < strlen (result))
	l = strlen (result);

      sprintf (obuf, "%s", num1);
      printf ("  %*s\n", l, obuf);
      sprintf (obuf, "%s", num2);
      printf ("+ %*s\n", l, obuf);
      printf ("  ");
      for (i = 0; i < l; i++)
	printf ("-");
      printf ("\n");
      sprintf (obuf, "%s", result);
      printf ("  %*s\n\n", l, obuf);
    }
}
