#include <bits/stdc++.h>
using namespace std;
const int MXN = 5e1 + 5;
int n;
int dp[MXN][MXN];
int nck[MXN][MXN];
array<int, 2> par[MXN][MXN];
vector<array<int, 2>> parts;
vector<vector<int>> ans;
void f(int i, int msk, int tar)
{
if (__builtin_popcount(msk) > tar) return;
if (__builtin_popcount(msk) + (int)parts.size() - i < tar) return;
if (i == parts.size())
{
ans.push_back({});
for (int j = 0; j < parts.size(); j++)
{
if (msk >> j & 1)
{
for (int x = parts[j][0]; x <= parts[j][1]; x++) ans.back().push_back(x);
}
}
return;
}
f(i + 1, msk | (1 << i), tar);
f(i + 1, msk, tar);
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
for (int i = 0; i < 50; i++) nck[i][0] = 1;
for (int i = 1; i < 50; i++)
{
for (int j = 0; j < 50; j++)
{
nck[i][j] = nck[i - 1][j] + (j ? nck[i - 1][j - 1] : 0);
if (nck[i][j] > 100) nck[i][j] = 100;
}
}
cin >> n;
dp[0][0] = 1;
for (int i = 0; i <= 50; i++)
{
for (int j = 1; j <= n; j++)
{
for (int sz : {1, 2, 3, 4, 6, 12})
{
int k = 12 / sz;
for (int cnt = k; cnt * sz <= i; cnt++)
{
if (nck[cnt][k] > j) continue;
if (dp[i - cnt * sz][j - nck[cnt][k]])
{
par[i][j] = {cnt, sz};
dp[i][j] = 1;
}
}
}
}
}
int x = 0, y = n;
while (x <= 50 && !dp[x][y]) x++;
assert(x <= 50);
while (x && y)
{
auto [cnt, sz] = par[x][y];
int k = 12 / sz;
int l = x - cnt * sz + 1;
parts.clear();
for (int i = 0; i < cnt; i++)
{
parts.push_back({l, l + sz - 1});
l += sz;
}
f(0, 0, k);
x -= cnt * sz, y -= nck[cnt][k];
}
for (int i = 0; i < ans.size(); i++)
{
for (int &j : ans[i]) cout << j - 1 << ' ';
cout << '\n';
}
}