#include <bits/stdc++.h>
#define rl(i) rec[order[i]].length
#define rw(i) rec[order[i]].width
using namespace std;
struct rectangle {
int length, width;
} rec[4];
int order[4] = {0, 1, 2, 3};
int ans = 2e9;
set<pair<int, int> > mp;
vector<pair<int, int> > res;
inline void init();
inline void part1();
inline void part2();
inline void part3();
inline void part4();
inline void part5();
inline void part6();
inline void update(int, int);
inline void do_it();
inline void work(int);
inline void solve();
int main() {
init();
solve();
return 0;
}
inline void init() {
for (int i = 0; i < 4; i++)
scanf("%d%d", &rec[i].length, &rec[i].width);
}
inline void update(int length, int width) {
if (length > width)
swap(length, width);
if (length * width > ans || mp.count(make_pair(length, width)) > 0)
return;
if (length * width == ans) {
mp.insert(make_pair(length, width));
res.push_back(make_pair(length, width));
return;
}
ans = length * width;
res.clear();
mp.insert(make_pair(length, width));
}
inline void part1() {
update(rl(0) + rl(1) + rl(2) + rl(3), max(max(rw(0), rw(1)), max(rw(2), rw(3))));
}
inline void part2() {
update(max(rl(0) + rl(1) + rl(2), rl(3)), max(rw(0), max(rw(1), rw(2))) + rw(3));
}
inline void part3() {
update(max(rl(0) + rl(1), rl(2)) + rl(3), max(rw(3), max(rw(0), rw(1)) + rw(2)));
}
inline void part4() {
update(rl(0) + max(rl(1), rl(2)) + rl(3), max(max(rw(0), rw(1) + rw(2)), rw(3)));
}
inline void part5() {
update(max(rl(0), rl(1)) + rl(2) + rl(3), max(max(rw(0) + rw(1), rw(2)), rw(3)));
}
inline void part6() {
int length;
if (rw(2) >= rw(1) + rw(3))
length = max(max(rl(0), rl(1) + rl(2)), rl(2) + rl(3));
else if (rw(3) < rw(2))
length = max(rl(0) + rl(1), max(rl(1), rl(3)) + rl(2));
else if (rw(2) == rw(3))
length = max(rl(0) + rl(1), rl(2) + rl(3));
else if (rw(2) < rw(3) && rw(3) < rw(2) + rw(0))
length = max(rl(0) + rl(1), max(rl(0), rl(2)) + rl(3));
else if (rw(3) >= rw(0) + rw(2))
length = max(rl(1), max(rl(0), rl(2)) + rl(3));
update(length, max(rw(0) + rw(2), rw(1) + rw(3)));
}
inline void do_it() {
part1();
part2();
part3();
part4();
part5();
part6();
}
inline void work(int depth) {
if (depth == 5) {
do_it();
return;
}
for (int i = 0; i < 4; i++) {
swap(rec[order[i]].length, rec[order[i]].width);
work(depth + 1);
swap(rec[order[i]].length, rec[order[i]].width);
}
}
inline void solve() {
do
work(1);
while (next_permutation(order, order + 4));
printf("%d\n", ans);
sort(res.begin(), res.end());
for (int i = 0; i < res.size(); i++)
printf("%d %d\n", res[i].first, res[i].second);
}