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

const int N=100;
const ll Inf=1e18;
ll n,m,p,fib[N];
queue<int> q;
vector<int> a;

int main()
{
	fib[1]=1;
	for (m=2;fib[m-1]<=Inf;m++)
		fib[m]=fib[m-1]+fib[m-2];
	cin>>n; p=n;
	for (int i=m;i>=1;i--)
		if (fib[i]<=p) p-=fib[i],a.push_back(i);
	a.push_back(2);
	ll v=(!(a[0]&1))+3;
	for (int i=1;i<a.size()-1;i++)
	{
		if (v==3) q.push(2);
		if (v==4) q.push(1);
		for (int j=a[i];j>a[i+1];j--)
			q.push(v),v=7-v;
	}
	q.push(3);
	cout<<q.size()<<"\n";
	ll x=0,y=0;
	while (q.size())
	{
		int z=q.front();
		cout<<z<<"\n"; q.pop();
		if (z==1) x++;
		if (z==2) y++;
		if (z==3) x+=y;
		if (z==4) y+=x;
	}
	//cerr<<x<<' '<<y;
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const double SQUP=0.618033992;
const double SQLO=0.618033982;

bool Deal(long long x,long long y,int dep)
{
	if(dep>129)return false;
	if(x<5 && y<5)
	{
		int tot=dep+x+y+1;
		if(tot>129)return false;
		printf("%d\n",tot);
		for(int i=1;i<=x;i++)puts("1");
		for(int i=1;i<=y;i++)puts("2");
		return true;
	}
//	printf("%lld %lld %d %.10lf\n",x,y,dep,1.0*x/y);
	if(rand()%25==0)
	{
		bool ret=Deal(x,y-1,dep+1);
		if(ret)puts("2");
		return ret;
	}
	if(rand()%25==0)
	{
		bool ret=Deal(x-1,y,dep+1);
		if(ret)puts("1");
		return ret;
	}
	if(x>y)
	{
//		if(y>x*SQUP && rand()%6)Deal(x,y-1,dep+1);
//		else if(x<200 && y<200 && x%y<y/16)Deal(x,y-1,dep+1);
//		else 
		bool ret=Deal(x-y,y,dep+1);
		if(ret)puts("3");
		return ret;
	}
	else
	{
//		if(x>y*SQUP && rand()%6)Deal(x-1,y,dep+1);
//		else if(x<200 && y<200 && y%x<x/16)Deal(x-1,y,dep+1);
//		else 
		bool ret=Deal(x,y-x,dep+1);
		if(ret)puts("4");
		return ret;
	}
}

int main()
{
	long long tar;scanf("%lld",&tar);
	long long x=tar*(sqrt(5)-1)/2,y=tar-x;
	while(!Deal(x,y,0));
	puts("3");
	return 0;
}