#include <bits/stdc++.h>
using namespace std;
const long long inf = (long long)1 << 62;
long long a[33333];
long long d[33333];
vector<long long> v1, v2;
bool can(long long a, long long b, long long c) { return b - a == c - b; }
bool can_push_all(vector<long long> &v2, int i, int n) {
  if (v2.size() == 0) return d[i] != inf;
  if (v2.size() == 1) {
    if (i == n) return true;
    if (a[i] - v2[0] == d[i]) return true;
    return false;
  }
  if (v2[1] - v2[0] != a[i] - v2[v2.size() - 1]) return false;
  if (i == n) return true;
  if (v2[1] - v2[0] != d[i]) return false;
  return true;
}
void push_all(vector<long long> &aa, int i, int n) {
  for (int j = i; j <= n; j++) aa.push_back(a[j]);
}
bool solve(int n) {
  for (int s = 1; s < (1 << 3); s++) {
    v1.clear();
    v2.clear();
    for (int i = 0; i < 3; i++) {
      if (s & (1 << i))
        v1.push_back(a[i + 1]);
      else
        v2.push_back(a[i + 1]);
    }
    if (v1.size() < v2.size()) swap(v1, v2);
    bool fail = false;
    for (int i = 2; i < v1.size(); i++) {
      if (can(v1[i - 2], v1[i - 1], v1[i]) == false) fail = true;
    }
    for (int i = 4; i <= n && !fail; i++) {
      int s = v1.size() - 1;
      if (can_push_all(v2, i, n)) {
        push_all(v2, i, n);
        return true;
      }
      if (can_push_all(v1, i, n)) {
        push_all(v1, i, n);
        return true;
      }
      if (can(v1[s - 1], v1[s], a[i])) {
        v1.push_back(a[i]);
      } else {
        if (v2.size() <= 1) {
          v2.push_back(a[i]);
        } else if (v2[1] - v2[0] != a[i] - v2[v2.size() - 1]) {
          fail = true;
        } else {
          v2.push_back(a[i]);
        }
      }
    }
    if (!fail) return true;
  }
  return false;
}
int main() {
  int n;
  while (scanf("%d", &n) != EOF) {
    for (int i = 1; i <= n; i++) scanf("%I64d", a + i);
    d[n - 1] = a[n] - a[n - 1];
    for (int i = n - 2; i >= 1; i--) {
      if (d[i + 1] == inf)
        d[i] = inf;
      else if (a[i + 1] - a[i] == d[i + 1])
        d[i] = d[i + 1];
      else
        d[i] = inf;
    }
    if (n == 2) {
      printf("%I64d\n%I64d\n", a[1], a[2]);
    } else if (n == 3) {
      printf("%I64d %I64d\n%I64d\n", a[1], a[2], a[3]);
    } else if (n == 4) {
      printf("%I64d %I64d\n%I64d %I64d\n", a[1], a[2], a[3], a[4]);
    } else {
      if (solve(n)) {
        if (v2.size() == 0) {
          long long t = v1[v1.size() - 1];
          v1.pop_back();
          v2.push_back(t);
        }
        for (int i = 0; i < v1.size(); i++)
          printf("%I64d%s", v1[i], (i == v1.size() - 1) ? "\n" : " ");
        for (int i = 0; i < v2.size(); i++)
          printf("%I64d%s", v2[i], (i == v2.size() - 1) ? "\n" : " ");
      } else {
        puts("No solution");
      }
    }
  }
}
