#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 0x3f3f3f3f, N = 3e4 + 5;
int n, a[N], b[N], c[N], curb, curc;
unordered_map<int, int> vis;
bool check() {
  int db = b[2] - b[1], dc = c[2] - c[1];
  for (int i = 3; i <= curb; i++)
    if (b[i] - b[i - 1] != db) return 0;
  for (int i = 3; i <= curc; i++)
    if (c[i] - c[i - 1] != dc) return 0;
  return 1;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  if (n == 2) {
    cout << a[1] << '\n' << a[2] << '\n';
    return 0;
  }
  int d;
  vis.clear();
  for (int i = 1; i <= n; i++) vis[a[i]]++;
  curb = 2, curc = 1;
  b[1] = a[1], b[2] = a[2], c[1] = a[3];
  d = b[2] - b[1];
  for (int i = 4; i <= n; i++) {
    if (a[i] - b[curb] == d && vis[a[i] + d])
      b[++curb] = a[i];
    else if (a[i] - b[curb] == d && !vis[a[i] + a[i] - c[curc]])
      b[++curb] = a[i];
    else
      c[++curc] = a[i];
    vis[a[i]]--;
  }
  if (check()) {
    for (int i = 1; i <= curb; i++) cout << b[i] << " \n"[i == curb];
    for (int i = 1; i <= curc; i++) cout << c[i] << " \n"[i == curc];
    return 0;
  }
  vis.clear();
  for (int i = 1; i <= n; i++) vis[a[i]]++;
  curb = 2, curc = 1;
  b[1] = a[1], b[2] = a[3], c[1] = a[2];
  d = b[2] - b[1];
  for (int i = 4; i <= n; i++) {
    if (a[i] - b[curb] == d && vis[a[i] + d])
      b[++curb] = a[i];
    else if (a[i] - b[curb] == d && !vis[a[i] + a[i] - c[curc]])
      b[++curb] = a[i];
    else
      c[++curc] = a[i];
    vis[a[i]]--;
  }
  if (check()) {
    for (int i = 1; i <= curb; i++) cout << b[i] << " \n"[i == curb];
    for (int i = 1; i <= curc; i++) cout << c[i] << " \n"[i == curc];
    return 0;
  }
  vis.clear();
  for (int i = 1; i <= n; i++) vis[a[i]]++;
  curb = 1, curc = 2;
  b[1] = a[1], c[1] = a[2], c[2] = a[3];
  d = c[2] - c[1];
  for (int i = 4; i <= n; i++) {
    if (a[i] - c[curc] == d && vis[a[i] + d])
      c[++curc] = a[i];
    else if (a[i] - c[curc] == d && !vis[a[i] + a[i] - b[curb]])
      c[++curc] = a[i];
    else
      b[++curb] = a[i];
    vis[a[i]]--;
  }
  if (check()) {
    for (int i = 1; i <= curb; i++) cout << b[i] << " \n"[i == curb];
    for (int i = 1; i <= curc; i++) cout << c[i] << " \n"[i == curc];
    return 0;
  }
  vis.clear();
  for (int i = 1; i <= n; i++) vis[a[i]]++;
  curb = 3, curc = 0;
  b[1] = a[1], b[2] = a[2], b[3] = a[3];
  d = b[3] - b[2];
  for (int i = 4; i <= n; i++) {
    if (a[i] - b[curb] == d && vis[a[i] + d])
      b[++curb] = a[i];
    else if (a[i] - b[curb] == d && (curc && !vis[a[i] + a[i] - c[curc]]))
      b[++curb] = a[i];
    else
      c[++curc] = a[i];
    vis[a[i]]--;
  }
  if (curc && check()) {
    for (int i = 1; i <= curb; i++) cout << b[i] << " \n"[i == curb];
    for (int i = 1; i <= curc; i++) cout << c[i] << " \n"[i == curc];
    return 0;
  }
  cout << "No solution" << '\n';
  return 0;
}
