#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7, INF = 0x3f3f3f3f;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long qpow(long long a, long long n) {
  long long r = 1 % P;
  for (a %= P; n; a = a * a % P, n >>= 1)
    if (n & 1) r = r * a % P;
  return r;
}
long long inv(long long first) {
  return first <= 1 ? 1 : inv(P % first) * (P - P / first) % P;
}
inline int rd() {
  int first = 0;
  char p = getchar();
  while (p < '0' || p > '9') p = getchar();
  while (p >= '0' && p <= '9') first = first * 10 + p - '0', p = getchar();
  return first;
}
const int N = 3e4 + 10;
int n, d1, d2, c[N], *f = c;
map<int, bool> v1[N], v2[N];
vector<int> a, b;
int dfs() {
  if (f == c + n) return !b.empty();
  if (a.size() < 2 || *f - a.back() == d1 && !v1[f - c + 1].count(d1)) {
    a.push_back(*f++);
    if (a.size() >= 2) d1 = a[1] - a[0], v1[f - c][d1] = 1;
    if (dfs()) return 1;
    --f, a.pop_back();
  }
  if (b.size() < 2 || *f - b.back() == d2 && !v2[f - c + 1].count(d2)) {
    b.push_back(*f++);
    if (b.size() >= 2) d2 = b[1] - b[0], v2[f - c][d2] = 1;
    if (dfs()) return 1;
    --f, b.pop_back();
  }
  return 0;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i <= n - 1; ++i) scanf("%d", c + i);
  if (dfs()) {
    for (auto &&t : a) printf("%d ", t);
    putchar(10);
    for (auto &&t : b) printf("%d ", t);
    putchar(10);
  } else
    puts("No solution");
}
