#include <bits/stdc++.h>
using namespace std;
int ar[30001], n;
vector<int> v1, v2;
int chek(multiset<int> &ds) {
  if (ds.empty()) return 1;
  multiset<int>::iterator it1, it2;
  it1 = ds.begin();
  it2 = ds.end();
  it2--;
  return *it1 == *it2;
}
int split(int a, int b) {
  if (n == 2) {
    v1.push_back(a);
    v2.push_back(b);
    return 1;
  }
  int i, j, d, nxt;
  multiset<int> ds;
  for ((i) = 0; (i) < (n - 1); (i)++) {
    ds.insert(ar[i + 1] - ar[i]);
  }
  d = b - a, nxt = a, j = -1;
  for ((i) = 0; (i) < (n); (i)++) {
    if (nxt == ar[i]) {
      v1.push_back(ar[i]);
      if (i != n - 1) ds.erase(ds.find(ar[i + 1] - ar[i]));
      nxt += d;
      if (j != -1) ds.erase(ds.find(ar[i] - ar[j]));
      if (j != -1 && i != n - 1) {
        ds.insert(ar[i + 1] - ar[j]);
      }
      if (chek(ds)) {
        for (int k = i + 1; k < n; k++) v2.push_back(ar[k]);
        return 1;
      }
    } else {
      v2.push_back(ar[i]);
      j = i;
    }
  }
  v1.clear();
  v2.clear();
  return 0;
}
int main() {
  int i;
  cin >> n;
  for ((i) = 0; (i) < (n); (i)++) cin >> ar[i];
  if (split(ar[0], ar[1]) || split(ar[0], ar[2]) || split(ar[1], ar[2])) {
    for ((i) = 0; (i) < (v1.size()); (i)++) cout << v1[i] << " ";
    cout << endl;
    for ((i) = 0; (i) < (v2.size()); (i)++) cout << v2[i] << " ";
    cout << endl;
  } else
    cout << "No solution\n";
  return 0;
}
