#include <bits/stdc++.h>
long long n;
long long use[30010], a[30010];
bool yooo() {
  long long pre = -1, cnt = 0;
  bool ok = true;
  long long delta;
  for (long long i = 0; i < n; i++) {
    if (use[i]) continue;
    if (pre == -1) {
      pre = i;
      cnt++;
    } else {
      if (cnt == 1)
        delta = a[i] - a[pre];
      else {
        if (a[i] - a[pre] != delta) ok = false;
      }
      cnt++;
      pre = i;
    }
  }
  return ok;
}
void output() {
  int cnt = 0;
  for (long long i = 0; i < n; i++) {
    if (use[i]) cnt++;
    if (cnt == n) use[i] = 0;
  }
  for (long long i = 0; i < n; i++)
    if (use[i]) printf("%I64d ", a[i]);
  puts("");
  for (long long i = 0; i < n; i++)
    if (!use[i]) printf("%I64d ", a[i]);
  puts("");
}
bool check(long long x, long long y) {
  memset(use, 0, sizeof(use));
  use[x] = use[y] = 1;
  long long delta = a[y] - a[x], now = a[y];
  for (long long i = y + 1; i < n; i++) {
    if (a[i] == now + delta) {
      use[i] = 1;
      now += delta;
    }
  }
  int cnt = 0;
  if (yooo()) {
    output();
    return true;
  }
  for (long long i = y + 1; i < n; i++)
    if (use[i]) cnt++;
  int tcnt = 0;
  for (long long i = y + 1; i < n; i++) {
    if (use[i]) tcnt++;
    if (tcnt == cnt) use[i] = 0;
  }
  if (yooo()) {
    output();
    return true;
  }
  return false;
}
int main() {
  while (scanf("%I64d", &n) == 1) {
    for (long long i = 0; i < n; i++) scanf("%I64d", &a[i]);
    if (n == 2) {
      printf("%I64d\n%I64d\n", a[0], a[1]);
      continue;
    }
    if (check(0, 1)) continue;
    if (check(0, 2)) continue;
    if (check(1, 2)) continue;
    if (n > 3 && check(0, 3)) continue;
    if (n > 3 && check(1, 3)) continue;
    if (n > 3 && check(2, 3)) continue;
    puts("No solution");
  }
  return 0;
}
