#include <bits/stdc++.h>
using namespace std;
const int N=1e5+1;
int A[N],n,In[N],ok,In2[N];
void Output(){
    int cnt1=0,cnt2=0;
    for(int i=1;i<=n;i++){
        if(In[i]==1)
            cnt1++;
        if(In[i]==2)
            cnt2++;
    }
    if(cnt2==0){
        cnt1--;
        cnt2=1;
        In[n]=2;
    }
    if(cnt1==0){
        cnt1=1;
        cnt2--;
        In[n]=1;
    }
    printf("%d\n",cnt1);
    for(int i=1;i<=n;i++){
        if(In[i]==1)
            printf("%d ",A[i]);
    }
    printf("\n");
    printf("%d\n",cnt2);
    for(int i=1;i<=n;i++){
        if(In[i]==2){
            printf("%d ",A[i]);
        }
    }
}
void reset1(){
    for(int i=1;i<=n;i++){
        if(In[i]==2)
            In[i]=0;
    }
}
bool SimpleCheck(){
    int fir=-1,sec=-1,x,cnt=2;
    for(int i=1;i<=n;i++){
        if(!In[i]){
            if(fir==-1){
                fir=i;
                In[fir]=2;
            }
            else{
                if(sec==-1){
                    sec=i;
                    x=A[sec]-A[fir];
                    In[sec]=2;
                }
                else{
                    if(A[i]!=A[fir]+cnt*x){
                        return 0;
                    }
                    else{
                        In[i]=2;
                        cnt++;
                    }
                }
            }
        }
    }
    return 1;
}
void Solve(int fir,int sec){
    In[fir]=1;
    int x=A[sec]-A[fir],i=sec,cnt=1,l1=fir,l2=-1;      //l1 i l2 are last in first street
    while(i!=n+1){
        if(A[i]==x*cnt+A[fir]){
            In[i]=1;
            cnt++;
            if(l2==-1)
                l2=i;
            else{
                l1=l2;
                l2=i;
            }
        }
        i++;
    }
    if(SimpleCheck()){
        ok=1;
        Output();
        return;
    }
    reset1();
    In[l2]=0;           //last is now in second street
    if(SimpleCheck()){
        ok=1;
        Output();
        return;
    }
    reset1();

    int x2=A[l1+1]-A[l1],cnt2=0,f;
    In[l1]=0,In[l2]=0;
    for(int i=1;i<=n;i++){
        if(!In[i]){
            f=i;                // find first in second street
            break;
        }
    }
    for(int i=1;i<=n;i++){
        if(A[i]==A[f]+cnt2*x2){
            In2[i]=2;
            cnt2++;
        }
        else{
            if(i>=l1){           //must fill larger then l1 bc first street won't
                ok=0;
                return;
            }
        }
    }
    cnt=0;
    for(int i=1;i<=n;i++){
        if(!In2[i]){
            if(A[i]!=A[fir]+cnt*x){
                ok=0;
                return ;
            }
            else{
                In2[i]=1;
                cnt++;
            }
        }
    }
    for(int i=1;i<=n;i++){
        In[i]=In2[i];
    }
    Output();
    ok=1;
}
void reset2(){
    for(int i=1;i<=n;i++){
        In[i]=0;
        In2[i]=0;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&A[i]);
    }
    sort(A+1,A+n+1);
    if(n==1){
        printf("1\n");
        printf("%d",A[0]);
        return 0;
    }
    if(n==2){
        printf("1\n");
        printf("%d\n",A[0]);
        printf("1\n");
        printf("%d",A[1]);
        return 0;
    }
    Solve(1,2);
    if(ok)
        return 0;
    reset2();

    Solve(1,3);
    if(ok)
        return 0;
    reset2();

    Solve(2,3);
    if(ok)
        return 0;
    else
        printf("-1");
    return 0;
}
/*
    8
    1 6 3 8 9 5 5 7
    */
