#include <bits/stdc++.h>
using namespace std;
const int oops = 1000;
struct Answer {
  int steps;
  int A, B, C, D;
  int twosAB, threesAB, twosCD, threesCD;
  Answer() : steps(-1) {}
  Answer(int steps, int A, int B, int C, int D, int t1, int t2, int t3, int t4)
      : steps(steps),
        A(A),
        B(B),
        C(C),
        D(D),
        twosAB(t1),
        threesAB(t2),
        twosCD(t3),
        threesCD(t4) {}
  bool operator<(const Answer& that) const { return steps < that.steps; }
};
vector<vector<vector<vector<bool> > > > best;
int factors[4][2];
int ansA, ansB, ansC, ansD;
void getFactors(int x, int i) {
  while (~x & 1) {
    x >>= 1;
    factors[i][0]++;
  }
  while (x % 3 == 0) {
    x /= 3;
    factors[i][1]++;
    factors[i][0]++;
  }
}
queue<Answer> q;
void add(const Answer& ans) {
  if (best[ans.twosAB][ans.threesAB][ans.twosCD][ans.threesCD]) return;
  best[ans.twosAB][ans.threesAB][ans.twosCD][ans.threesCD] = 1;
  q.push(ans);
}
Answer bfs(int A, int B, int C, int D) {
  q.push(Answer(0, A, B, C, D, 0, 0, 0, 0));
  best[0][0][0][0] = 1;
  while (!q.empty()) {
    Answer cur = q.front();
    q.pop();
    if (1LL * cur.A * cur.B == 1LL * cur.C * cur.D) return cur;
    int A = cur.A, B = cur.B, C = cur.C, D = cur.D;
    if (~A & 1) {
      Answer nex = cur;
      nex.A >>= 1;
      nex.steps++;
      nex.twosAB++;
      add(nex);
    }
    if (~B & 1) {
      Answer nex = cur;
      nex.B >>= 1;
      nex.steps++;
      nex.twosAB++;
      add(nex);
    }
    if (~C & 1) {
      Answer nex = cur;
      nex.C >>= 1;
      nex.steps++;
      nex.twosCD++;
      add(nex);
    }
    if (~D & 1) {
      Answer nex = cur;
      nex.D >>= 1;
      nex.steps++;
      nex.twosCD++;
      add(nex);
    }
    if (A % 3 == 0) {
      Answer nex = cur;
      nex.A /= 3;
      nex.A <<= 1;
      nex.steps++;
      nex.threesAB++;
      add(nex);
    }
    if (B % 3 == 0) {
      Answer nex = cur;
      nex.B /= 3;
      nex.B <<= 1;
      nex.steps++;
      nex.threesAB++;
      add(nex);
    }
    if (C % 3 == 0) {
      Answer nex = cur;
      nex.C /= 3;
      nex.C <<= 1;
      nex.steps++;
      nex.threesCD++;
      add(nex);
    }
    if (D % 3 == 0) {
      Answer nex = cur;
      nex.D /= 3;
      nex.D <<= 1;
      nex.steps++;
      nex.threesCD++;
      add(nex);
    }
  }
  return Answer();
}
int main() {
  int c, c2;
  int A, B, C, D;
  scanf("%d%d%d%d", &A, &B, &C, &D);
  getFactors(A, 0);
  getFactors(B, 0);
  getFactors(C, 1);
  getFactors(D, 1);
  vector<int> S;
  for (c = 0; c < 2; c++)
    for (c2 = 0; c2 < 2; c2++) S.push_back(factors[c][c2] + 1);
  best = vector<vector<vector<vector<bool> > > >(
      S[0], vector<vector<vector<bool> > >(
                S[1], vector<vector<bool> >(S[2], vector<bool>(S[3], 0))));
  Answer ret = bfs(A, B, C, D);
  if (ret.steps == -1)
    printf("-1\n");
  else {
    printf("%d\n", ret.steps);
    printf("%d %d\n", ret.A, ret.B);
    printf("%d %d\n", ret.C, ret.D);
  }
  return 0;
}
