#include <bits/stdc++.h>
int progs(int *arr, int caso, int n, int *contp1, int *contp2, int *pro1,
          int *pro2, int *bandera);
int veriprog2(int *pro2, int contp2);
int main() {
  int n, i, caso = 0, fin = 0, contp1 = 0, contp2 = 0, bandera = -1;
  scanf("%d ", &n);
  int *arr = (int *)malloc(sizeof(int) * n);
  int *pro1 = (int *)malloc(sizeof(int) * n);
  int *pro2 = (int *)malloc(sizeof(int) * n);
  for (i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
  }
  while (!fin && caso < 3) {
    fin = progs(arr, caso, n, &contp1, &contp2, pro1, pro2, &bandera);
    caso++;
  }
  if (fin) {
    if (contp2 != 0) {
      if (bandera == -1) {
        for (i = 0; i < contp1; i++) {
          printf("%d ", pro1[i]);
        }
        printf("\n");
        for (i = 0; i < contp2; i++) {
          printf("%d ", pro2[i]);
        }
      } else {
        for (i = 0; i < contp1; i++) {
          printf("%d ", pro1[i]);
        }
        printf("\n");
        for (i = 0; i < contp2; i++) {
          if (i != bandera) {
            printf("%d ", pro2[i]);
          } else {
            printf("%d ", pro1[contp1]);
            printf("%d ", pro2[i]);
          }
        }
      }
    } else {
      for (i = 0; i < contp1 - 1; i++) {
        printf("%d ", pro1[i]);
      }
      printf("\n");
      printf("%d", pro1[contp1 - 1]);
    }
  } else {
    printf("No solution");
  }
  free(arr);
  free(pro1);
  free(pro2);
  return 0;
}
int progs(int *arr, int caso, int n, int *contp1, int *contp2, int *pro1,
          int *pro2, int *bandera) {
  int pivot, cons, i;
  *bandera = -1;
  *contp1 = 0;
  *contp2 = 0;
  if (caso == 0) {
    cons = arr[1] - arr[0];
    pivot = arr[0];
    pro1[0] = arr[0];
    *contp1 = 1;
    for (i = 1; i < n; i++) {
      if (arr[i] - pivot == cons) {
        pro1[*contp1] = arr[i];
        pivot = arr[i];
        (*contp1)++;
      } else {
        pro2[*contp2] = arr[i];
        (*contp2)++;
      }
    }
    if (!veriprog2(pro2, *contp2)) {
      if (pro2[1] - pro2[0] == pro2[2] - pro2[1]) {
        cons = pro2[1] - pro2[0];
      } else if (pro1[*contp1 - 1] - pro2[0] == pro2[1] - pro1[*contp1 - 1]) {
        cons = pro1[*contp1 - 1] - pro2[0];
      } else {
        cons = pro2[1] - pro2[0];
      }
      pivot = pro2[0];
      for (i = 0; i < *contp2; i++) {
        if (pro2[i] == pivot) {
          pivot += cons;
        } else {
          if (pro1[*contp1 - 1] == pivot) {
            *bandera = i;
            pivot = pivot + cons;
            (*contp1)--;
            i--;
          } else {
            return 0;
          }
        }
      }
    }
    return 1;
  } else if (caso == 2) {
    cons = arr[2] - arr[1];
    pivot = arr[2];
    pro2[0] = arr[0];
    pro1[0] = arr[1];
    pro1[1] = arr[2];
    *contp1 = 2;
    *contp2 = 1;
    for (i = 3; i < n; i++) {
      if (arr[i] - pivot == cons) {
        pro1[*contp1] = arr[i];
        pivot = arr[i];
        (*contp1)++;
      } else {
        pro2[*contp2] = arr[i];
        (*contp2)++;
      }
    }
    if (!veriprog2(pro2, *contp2)) {
      if (pro2[1] - pro2[0] == pro2[2] - pro2[1]) {
        cons = pro2[1] - pro2[0];
      } else if (pro1[*contp1 - 1] - pro2[0] == pro2[1] - pro1[*contp1 - 1]) {
        cons = pro1[*contp1 - 1] - pro2[0];
      } else {
        cons = pro2[1] - pro2[0];
      }
      pivot = pro2[0];
      for (i = 0; i < *contp2; i++) {
        if (pro2[i] == pivot) {
          pivot += cons;
        } else {
          if (pro1[*contp1 - 1] == pivot) {
            *bandera = i;
            pivot = pivot + cons;
            (*contp1)--;
            i--;
          } else {
            return 0;
          }
        }
      }
    }
    return 1;
  } else if (caso == 1) {
    cons = arr[2] - arr[0];
    pivot = arr[2];
    pro2[0] = arr[1];
    pro1[0] = arr[0];
    pro1[1] = arr[2];
    *contp1 = 2;
    *contp2 = 1;
    for (i = 3; i < n; i++) {
      if (arr[i] - pivot == cons) {
        pro1[*contp1] = arr[i];
        pivot = arr[i];
        (*contp1)++;
      } else {
        pro2[*contp2] = arr[i];
        (*contp2)++;
      }
    }
    if (!veriprog2(pro2, *contp2)) {
      if (pro2[1] - pro2[0] == pro2[2] - pro2[1]) {
        cons = pro2[1] - pro2[0];
      } else if (pro1[*contp1 - 1] - pro2[0] == pro2[1] - pro1[*contp1 - 1]) {
        cons = pro1[*contp1 - 1] - pro2[0];
      } else {
        cons = pro2[1] - pro2[0];
      }
      pivot = pro2[0];
      for (i = 0; i < *contp2; i++) {
        if (pro2[i] == pivot) {
          pivot += cons;
        } else {
          if (pro1[*contp1 - 1] == pivot) {
            *bandera = i;
            (*contp1)--;
            pivot = pivot + cons;
            i--;
          } else {
            return 0;
          }
        }
      }
    }
    return 1;
  }
}
int veriprog2(int *pro2, int contp2) {
  int i, razon;
  if (contp2 == 1 || contp2 == 0) {
    return 1;
  } else {
    razon = pro2[1] - pro2[0];
    for (i = 1; i < contp2 - 1; i++) {
      if (pro2[i + 1] - pro2[i] != razon) {
        return 0;
      }
    }
  }
  return 1;
}
