#include <bits/stdc++.h>
using namespace std;
bool sign[30010];
int num[2];
int value[30010];
int start[3][2] = {{0, 1}, {0, 2}, {1, 2}};
int n;
bool Legal(int pos) {
  if (pos == n - 1) return true;
  int d = value[pos + 1] - value[pos];
  for (int i = pos + 2; i < n; i++) {
    if (value[i] - value[i - 1] != d) return false;
  }
  return true;
}
bool Legal2() {
  int temp = -INT_MAX;
  int d = INT_MAX;
  bool ok = true;
  for (int i = n - 1; i >= 0; i--) {
    if (!sign[i]) {
      if (temp == -INT_MAX) {
        temp = value[i];
        continue;
      }
      if (d == INT_MAX) {
        d = value[i] - temp;
        temp = value[i];
      } else if (value[i] - temp != d) {
        ok = false;
        break;
      } else
        temp = value[i];
    }
  }
  if (ok) return true;
  ok = true;
  temp = -INT_MAX;
  d = INT_MAX;
  for (int i = n - 1; i >= 0; i--) {
    if (!sign[i]) {
      if (temp == -INT_MAX) {
        temp = value[i];
        continue;
      }
      if (d == INT_MAX) {
        d = value[i] - temp;
        temp = value[i];
      } else if (value[i] - temp != d)
        return false;
      else
        temp = value[i];
    }
    if (sign[i] && ok) {
      sign[i] = false;
      if (temp == -INT_MAX) {
        temp = value[i];
        continue;
      }
      if (d == INT_MAX) {
        d = value[i] - temp;
        temp = value[i];
      } else if (value[i] - temp != d) {
        sign[i] = true;
        ok = false;
      } else
        temp = value[i];
    }
  }
  return true;
}
void Print() {
  for (int i = 0; i < n; i++)
    if (sign[i]) printf("%d ", value[i]);
  printf("\n");
  for (int i = 0; i < n; i++)
    if (!sign[i]) printf("%d ", value[i]);
  printf("\n");
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) scanf("%d", &value[i]);
  if (n <= 4) {
    if (n == 2)
      cout << value[0] << endl << value[1] << endl;
    else if (n == 3)
      cout << value[0] << endl << value[1] << " " << value[2] << endl;
    else {
      cout << value[0] << " " << value[1] << endl;
      cout << value[2] << " " << value[3] << endl;
    }
    return 0;
  }
  if (value[0] + value[2] == 2 * value[1]) {
    if (value[0] == value[1]) {
      if (value[n - 1] == value[0]) {
        for (int i = 0; i < n - 1; i++) printf("%d ", value[0]);
        printf("\n");
        printf("%d\n", value[0]);
        return 0;
      } else {
        int pos = 3;
        for (; pos < n; pos++)
          if (value[pos] != value[0]) break;
        if (Legal(pos)) {
          for (int i = 0; i < pos; i++) printf("%d ", value[0]);
          printf("\n");
          for (int i = pos; i < n; i++) printf("%d ", value[i]);
          printf("\n");
          return 0;
        }
      }
    } else {
      int temp = value[2];
      sign[0] = sign[1] = sign[2] = true;
      int d = value[1] - value[0];
      int tot = 3;
      for (int i = 3; i < n; i++) {
        if (value[i] - temp != d)
          continue;
        else {
          temp = value[i];
          sign[i] = true;
          tot++;
        }
      }
      if (Legal2()) {
        if (tot == n) sign[n - 1] = false;
        Print();
        return 0;
      }
    }
  }
  for (int sss = 0; sss < 3; sss++) {
    memset(sign, false, sizeof(sign));
    int temp = value[start[sss][1]];
    int d = temp - value[start[sss][0]];
    sign[start[sss][0]] = sign[start[sss][1]] = true;
    for (int i = 3; i < n; i++) {
      if (value[i] - temp != d)
        continue;
      else {
        temp = value[i];
        sign[i] = true;
      }
    }
    if (Legal2()) {
      Print();
      return 0;
    }
  }
  printf("No solution\n");
  return 0;
}
