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

long long f[100];

int main() {
    f[0] = 0;
    f[1] = 1;
    for (int i = 2; i < 100; ++i) {
        f[i] = f[i - 2] + f[i - 1];
    }
    long long n;
    scanf("%lld", &n);
    queue<int> Q;
    while (n) {
        int x = upper_bound(f + 1, f + 93, n) - f - 1;
        Q.push(x);
        n -= f[x];
    }
    int lmt = Q.front();
    vector<int> ans;
    for (int i = 1; i <= lmt; ++i) {
        if (i != 1) {
            if ((i & 1) ^ (lmt & 1)) ans.push_back(4);
            else ans.push_back(3);
        }
        while (!Q.empty() && lmt - Q.front() + 1 == i) {
            Q.pop();
            if ((i & 1) ^ (lmt & 1)) ans.push_back(2);
            else ans.push_back(1);
        }
    }
    printf("%d\n", (int)ans.size());
    for (int it : ans) {
        printf("%d\n", it);
    }
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define mod 1000000007
#define ll long long
vector<int>v;
int ans[N];
ll n,a[N];
void add(int x,int p){
	for(int i=ans[0];i>x;i--)ans[i+1]=ans[i];
	ans[0]++,ans[x+1]=p;
}
int main(){
	scanf("%lld",&n);
	a[0]=a[1]=1;
	for(int i=2;i<=90;i++)a[i]=a[i-1]+a[i-2];
	for(int i=90;i;i--)
		if (n>=a[i]){
			n-=a[i];
			v.push_back(i);
		}
	add(ans[0],1);
	for(int i=1;i<=v[0];i++)add(ans[0],3+(i&1));
	for(int i=1;i<v.size();i++)add(ans[0]-v[i],5-ans[ans[0]-v[i]+1]);
	ans[ans[0]]=3;
	for(int i=0;i<=ans[0];i++)printf("%d\n",ans[i]);
} 