#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int inf = 1061109567;
const int dir[][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
const int maxn = 3e4 + 5;
vector<int> v1, v2;
int flag[maxn], a[maxn], n;
void print() {
  for (auto &i : v1) printf("%d ", i);
  cout << endl;
  for (auto &i : v2) printf("%d ", i);
  cout << endl;
}
int ok() {
  v1.clear();
  v2.clear();
  for (int i = 0; i < n; i++) {
    if (flag[i])
      v1.push_back(a[i]);
    else
      v2.push_back(a[i]);
  }
  if (v2.empty()) return 0;
  if (v2.size() < 3) return 1;
  int d = v2[1] - v2[0];
  for (int i = 2; i < v2.size(); i++) {
    if (v2[i] - v2[i - 1] != d) return 0;
  }
  return 1;
}
int check(int x, int y) {
  int d = y - x;
  int nxt = x;
  memset(flag, 0, sizeof(flag));
  for (int i = 0; i < n; i++) {
    if (a[i] == nxt) {
      flag[i] = 1;
      nxt += d;
    }
  }
  if (ok()) {
    print();
    return 1;
  }
  int i = n - 1;
  while (flag[i] == 0) i--;
  flag[i] = 0;
  if (ok()) {
    print();
    return 1;
  }
  return 0;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
  }
  if (check(a[0], a[1])) return 0;
  if (check(a[0], a[2])) return 0;
  if (check(a[1], a[2])) return 0;
  puts("No solution");
  return 0;
}
