#include <bits/stdc++.h>
using namespace std;

#define kraj return 0;
#define vi vector<int>
#define it iterator

int maxi0;
int getMid(int a,int b) {return (a+b)/2;}
int getMax(vi::it tree,int n,int l,int r,int st,int nd,int now)
{
    if((st<l && nd<l)||(st>r && nd>r)) return -1;
    if(st>=l && nd<=r) return *(tree+now);
    int mid=getMid(st,nd);
    return max(getMax(tree,n,l,r,st,mid,2*now+1),getMax(tree,n,l,r,mid+1,nd,2*now+2));
}
int maxi(vi::it tree,int n,int l,int r)
{
    return getMax(tree,n,l,r,0,n-1,0);
}
int construct(vi::it tree,vi a,int st,int nd,int now)
{
    if(st==nd) {
        *(tree+now)=a[st];
        return a[st];
    }
    int mid=getMid(st,nd);
    *(tree+now)=max(construct(tree,a,st,mid,2*now+1),construct(tree,a,mid+1,nd,2*now+2));

    return *(tree+now);
}
vi::it makePoint(vi a,int n)
{
    int height=(int)(ceil(log2(n)));
    int maxSize=2*(int)(pow(2,height))-1;
    vi t(maxSize,-1);
    vi::it tree=t.begin();
    construct(tree,a,0,n-1,0);
    maxi0=*tree;
    return tree;
}

int main()
{
    int n;
    cin>>n;
    vi a(n);
    for(int i=0; i<n; ++i) cin>>a[i];
    if(n==1) {}
    else if(n==2) swap(a[0],a[1]);
    else {
        vector<set<int>> b(10);
        int maxic;
        for(int i=0; i<n; ++i) b[a[i]].insert(i);
        vi::it tree=makePoint(a,n);
        bool ind=false,ind1=false;
        for(int i=0; i<n; ++i) {
            if(i) maxic=maxi(tree,n,i,n-1);
            else maxic=maxi0;
            if(maxic==a[i]) ind1=true;
            if(maxic<=a[i]) continue;
            ind=true;
            swap(a[i],a[*--b[maxic].end()]);
            break;
        }
        if(!ind && ind1==false) swap(a[n-1],a[n-2]);
    }
    for(int i=0; i<n; ++i) cout<<a[i]<<" ";
    kraj
}