1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <bits/stdc++.h>
using namespace std;
using ll	= long long;
using ull	= unsigned long long;
using ld	= long double;
using pii	= pair<int,int>;
using pll	= pair<ll,ll>;
using vi	= vector<int>;
using vb	= vector<bool>;
using vc	= vector<char>;
using vvc	= vector<vc>;
using vvi	= vector<vi>;
using vvb	= vector<vb>;
using vpii	= vector<pii>;
using vpll	= vector<pll>;
using vll	= vector<ll>;
using vvll	= vector<vll>;
using vull	= vector<ull>;
#define f first
#define s second
#define pb emplace_back
#define rep(i, begin, end) for(auto i = (begin); i <= (end); ++i)
#define repr(i, begin, end) for(auto i = (begin); i >= (end); --i)
#define bend(X) X.begin(), X.end()
#ifdef LOCAL
#define nl << endl
#define deb(x) cout << #x << " = " << x << endl
#define say(x) cout << x << endl
void print() { cout << endl; }
#else
#define nl << '\n'
#define deb(x)
#define say(x)
void print() { cout << '\n'; }
#endif
constexpr int INF = 1e9+1e7;
constexpr ll INFl = INF;
constexpr ll INFll = 1e18+1e16;
template <typename T, typename... Args> void print(T x, Args... args) { cout << x << ' '; print(args...); }
template <typename T1, typename T2> ostream& operator<<(ostream& os, pair<T1,T2> x) { os << '(' << x.f << ' ' << x.s << ')'; return os; }
template <typename T1, typename T2> istream& operator>>(istream& is, pair<T1,T2>& x) { is >> x.f >> x.s; return is; }
template <typename T> istream& operator>>(istream& is, vector<T>& x) { for(T& i : x) is >> i; return is; }
template <typename T> ostream& operator<<(ostream& os, vector<T>& x) { for(const T& i : x) os << i << ' '; return os; }
template <typename T> ostream& operator<<(ostream& os, set<T>& x) { for(const T& i : x) os << i << ' '; return os; }
template <typename T1, typename T2> ostream& operator<<(ostream& os, map<T1, T2>& x) { for(const auto& i : x) os << "(" << i.first << " : " << i.second << ") "; return os; }
template <typename T1, typename T2> pair<T1,T2> operator+(const pair<T1,T2>& A, const pair<T1,T2>& B) { return {A.f+B.f, A.s+B.s}; }
template <typename T1, typename T2> pair<T1,T2> operator-(const pair<T1,T2>& A, const pair<T1,T2>& B) { return {A.f-B.f, A.s-B.s}; }
template <typename T1, typename T2> pair<T1,T2> operator-(const pair<T1,T2>& A) { return {-A.f, -A.s}; }
template <typename T1, typename T2> bool maxe(T1& A, const T2& B) { return A<B ? A=B,true : false; }
template <typename T1, typename T2> bool mine(T1& A, const T2& B) { return B<A ? A=B,true : false; }

// ----------------------------------------------------------------
// ----------------------------------------------------------------

int n, k;
vvi G;

inline void dodaj(int v, int a, int b) {
	say("dodaj("<<v<<", "<<a<<", "<<b<<")");
	if(v == INF) return;
	G[v].pb(a);
	G[v].pb(b);
}

ll solve() {
	int a = INF, b = 1;
	G.pb(); G.pb();
	while(k > 1) {
		int c, d;
		deb(k);
		deb(a<<" "<<b);
		if(k%2 == 0) {
			c = b+1, d = b+2;
			G.pb(); G.pb();
			k /= 2;
		}
		else if(k%2 == 1) {
			c = INF, d = b+1;
			G.pb();
			--k;
		}
		deb(c<<" "<<d);
		dodaj(a, c, d);
		dodaj(b, c, d);
		a = c;
		b = d;
	}
	G.pb(vi{-1,-1});
	n = G.size()-1;
	dodaj(a,n,-1);
	dodaj(b,n,-1);
	rep(v, 1, n)
		for(auto& u : G[v])
			if(u == INF)
				u = n;
	
	print(n);
	rep(v, 1, n)
		print(G[v]);
	
	return -INF;
}

void in() {
	cin >> k;
}



int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int noOfTests = 1;
	//cin >> noOfTests;
	
	while(noOfTests --> 0) {
		in();
		ll result = solve();
		if     (result == ll(-'t')) cout << "TAK\n";
		else if(result == ll(-'n')) cout << "NIE\n";
		else if(result == ll(-'y')) cout << "YES\n";
		else if(result == ll(-'o')) cout << "NO\n";
		else if(result == ll(-'e')) cout << "Popsute\n";
		else if(result != -INF) cout << result << '\n';
	}
	
	return 0;
}