#include<iostream>
using namespace std;
int minStep,n,*arr,*record,*lis,index,recordMax,lisCount;
void copy()
{
for(int i=0;i<lisCount;i++)
lis[i]=record[i];
}
void dfs(int step)
{
if(step>=n)
{
if(index>lisCount)
{
lisCount=index;
copy();
}
return;
}
if(n-step+1<minStep-index)
return;
else if(recordMax<arr[step+1])
{
int temp=recordMax;
recordMax=arr[step+1];
record[index]=arr[step+1];
index++;
dfs(step+1);
index--;
record[index]=0;
recordMax=temp;
}
dfs(step+1);
}
int getMinStep()
{
int i,count=1,temp=arr[1];
for(i=2;i<=n;i++)
if(temp<arr[i])
{
temp=arr[i];
count++;
}
return count;
}
void init()
{
index=0;
recordMax=0;
lisCount=0;
arr=new int[n+1];
record=new int[n+1]();
lis=new int[n+1]();
arr[0]=0;
for(int i=1;i<=n;i++)
cin>>arr[i];
}
void show(int max)
{
cout<<"LIS length: "<<max<<endl;
for(int i=0;i<max;i++)
cout<<lis[i]<<" ";
cout<<endl;
}
void deleteArray()
{
delete lis;
delete record;
delete arr;
}
int main()
{
cin>>n;
init();
minStep=getMinStep();
if(minStep==n)
{
show(n);
return 0;
}
dfs(0);
show(lisCount);
deleteArray();
return 0;
}