#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const int N = 3e4 + 5;
int n, a[N], us[N];
struct solve {
  vector<int> s;
  inline void out() {
    vector<int> ans1, ans2;
    for (int i = 1; i <= n; ++i) {
      if (!us[i])
        ans1.push_back(a[i]);
      else
        ans2.push_back(a[i]);
    }
    for (int i = 0; i < ans1.size(); ++i) cout << ans1[i] << ' ';
    cout << '\n';
    for (int i = 0; i < ans2.size(); ++i) cout << ans2[i] << ' ';
    exit(0);
  }
  inline int usprog() {
    s.clear();
    for (int i = 1; i <= n; ++i) {
      if (!us[i]) {
        s.push_back(a[i]);
      }
    }
    if (s.size() == 0) return 0;
    if (s.size() < 3) return 1;
    int dif = s[1] - s[0];
    for (int i = 2; i < s.size(); ++i) {
      if (s[i - 1] + dif != s[i]) return 0;
    }
    return 1;
  }
  inline void cprog(int x, int y) {
    memset(us, 0, sizeof(us));
    int dif = y - x;
    int nxt = x;
    for (int i = 1; i <= n; ++i) {
      if (a[i] == nxt) {
        us[i] = 1;
        nxt += dif;
      }
    }
    if (usprog()) out();
    int i = 1;
    while (us[i] == 0) ++i;
    us[i] = 0;
    if (usprog()) out();
    us[i] = 1;
    i = n;
    while (us[i] == 0) --i;
    us[i] = 0;
    if (usprog()) out();
  }
} p;
int main() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  for (int i = 1; i <= 3; ++i) {
    for (int j = i + 1; j <= 3; ++j) {
      p.cprog(a[i], a[j]);
    }
  }
  cout << "No solution\n";
}
