#include <bits/stdc++.h>
using namespace std;
bool ok(vector<int>& z, int v) {
  if (z.size() < 2) return true;
  return z[z.size() - 1] * 2 == z[z.size() - 2] + v;
}
vector<int> x;
vector<int> y;
bool go(int idx, int* a, int n) {
  if (idx == n) return true;
  if (idx == n - 1) {
    if (y.size() == 0) {
      y.push_back(a[idx]);
      return true;
    }
    if (x.size() == 0) {
      x.push_back(a[idx]);
      return true;
    }
  }
  bool bx = ok(x, a[idx]);
  bool by = ok(y, a[idx]);
  if (bx && by) {
    if (x.size() >= 2 && x[x.size() - 1] == x[x.size() - 2]) {
      x.push_back(a[idx]);
      if (go(idx + 1, a, n)) return true;
      x.pop_back();
    } else if (y.size() >= 2 && y[y.size() - 1] == y[y.size() - 2]) {
      y.push_back(a[idx]);
      if (go(idx + 1, a, n)) return true;
      y.pop_back();
    } else if (x.size() >= 2 && y.size() == 0) {
      x.push_back(a[idx]);
      if (go(idx + 1, a, n)) return true;
      x.pop_back();
    } else if (y.size() >= 2 && x.size() == 0) {
      y.push_back(a[idx]);
      if (go(idx + 1, a, n)) return true;
      y.pop_back();
    } else {
      x.push_back(a[idx]);
      if (go(idx + 1, a, n)) return true;
      x.pop_back();
      y.push_back(a[idx]);
      if (go(idx + 1, a, n)) return true;
      y.pop_back();
    }
  } else {
    if (bx) {
      x.push_back(a[idx]);
      if (go(idx + 1, a, n)) return true;
      x.pop_back();
    }
    if (by) {
      y.push_back(a[idx]);
      if (go(idx + 1, a, n)) return true;
      y.pop_back();
    }
  }
  return false;
}
int main() {
  int n;
  cin >> n;
  int a[30000];
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  if (go(0, a, n)) {
    for (int i = 0; i < x.size(); i++) {
      cout << x[i] << (i == x.size() - 1 ? '\n' : ' ');
    }
    for (int i = 0; i < y.size(); i++) {
      cout << y[i] << (i == y.size() - 1 ? '\n' : ' ');
    }
  } else {
    cout << "No solution" << endl;
  }
  return 0;
}
