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

#define REP(i,n) for(int i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()

using ll=long long;
ll Fib[89];

int main(){
  Fib[0]=Fib[1]=1;
  for(int i=2;i<89;i++)Fib[i]=Fib[i-1]+Fib[i-2];

  ll n;cin>>n;
  vector<int> A;
  for(int i=88;i>=0;i--){
    if(n>=Fib[i]){
      A.push_back(i);
      n-=Fib[i];
    }
  }
  reverse(ALL(A));
  vector<int> ans;
  int now=0;
  for(int i=0;i<88&&now<A.size();i++){
    if(A[now]==i){
      ans.push_back(1+(i&1));
      now++;
    }
    ans.push_back(3+(i&1));
  }
  reverse(ALL(ans));
  cout<<ans.size()<<endl;
  for(int p:ans)cout<<p<<endl;
}

#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;
}