#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T INT_LEN(T v) {
  int len = 1;
  while (v /= 10) ++len;
  return len;
}
template <class T>
inline T xmlt(T X0, T Y0, T X1, T Y1, T X2, T Y2) {
  return (X1 - X0) * (Y2 - Y0) - (X2 - X0) * (Y1 - Y0);
}
int ar[30005];
bool vis[30005];
int N;
void input(int n) {
  int i;
  for (i = 0; i < n; i++) scanf("%d", &ar[i]);
}
bool can(int n) {
  int i, k = 0, dis = -0x7F7F7F7F, pre;
  for (i = 0; i < n; i++) {
    if (!vis[i]) {
      if (k++ > 0) {
        if (dis == -0x7F7F7F7F)
          dis = ar[i] - pre;
        else if (dis ^ (ar[i] - pre))
          return false;
      }
      pre = ar[i];
    }
  }
  return k ? true : false;
}
bool chk(int s, int t, int n, int lt) {
  int i, dis = t - s;
  memset(vis, 0, sizeof(vis));
  for (i = lt; i < n; i++) {
    if (ar[i] == s) s += dis, vis[i] = true;
  }
  if (can(n)) return 1;
  int len = ~-n;
  while (!vis[len]) len--;
  vis[len] = false;
  if (can(n)) return 1;
  return 0;
}
void print(int n) {
  int i;
  bool flag = false;
  for (i = 0; i < n; i++) {
    if (vis[i]) {
      if (flag) putchar(' ');
      printf("%d", ar[i]);
      flag = true;
    }
  }
  puts("");
  flag = false;
  for (i = 0; i < n; i++) {
    if (!vis[i]) {
      if (flag) putchar(' ');
      printf("%d", ar[i]);
      flag = true;
    }
  }
  puts("");
}
void solve(int n) {
  if (chk(ar[0], ar[1], n, 0)) {
    print(n);
    return;
  } else if (chk(ar[0], ar[2], n, 0)) {
    print(n);
    return;
  } else if (chk(ar[1], ar[2], n, 1)) {
    print(n);
    return;
  } else
    puts("No solution");
}
int main(void) {
  while (~scanf("%d", &N)) {
    input(N);
    solve(N);
  }
  return 0;
}
