#include <bits/stdc++.h>
using namespace std;
const int inf = numeric_limits<int>::max();
int used = 0;
void print(const vector<int>& v, bool ok = true)
{
for(auto &i : v) cout << i << ' ';
if(ok) cout << '\n';
}
void make(int n)
{
if(n == 1)
{
for(int i = used; i < used + 12; ++i) cout << i << ' ';
cout << '\n';
used += 12;
}
else if(12 %(n-1) == 0)
{
int seg = 12 / (n-1);
vector<vector<int>> v(n, vector<int>(seg));
for(auto& i : v)
{
for(int j = 0; j < seg; ++j)
{
i[j] = used;
++used;
}
}
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
if(j != i) print(v[j], 0);
}
cout << '\n';
}
}
else if(n == 6)
{
vector<vector<int>> seg(4, vector<int>(6));
for(int i = 0; i < 4; ++i)
{
for(int j = 0; j < 6; ++j)
{
seg[i][j] = used;
++used;
}
}
for(int i = 0; i < 4; ++i)
{
for(int j = i+1; j < 4; ++j)
{
print(seg[i], 0);
print(seg[j]);
}
}
}
else if(n == 10)
{
vector<vector<int>> seg(5, vector<int>(4));
for(int i = 0; i < seg.size(); ++i)
{
for(int j = 0; j < seg[0].size(); ++j)
{
seg[i][j] = used;
++used;
}
}
for(int i = 0; i < seg.size(); ++i)
{
for(int j = i+1; j < seg.size(); ++j)
{
for(int k = j+1; k < seg.size(); ++k)
{
print(seg[i], 0);
print(seg[j], 0);
print(seg[k]);
}
}
}
}
else if(n == 15)
{
vector<vector<int>> seg(6, vector<int>(3));
for(int i = 0; i < seg.size(); ++i)
{
for(int j = 0; j < seg[0].size(); ++j)
{
seg[i][j] = used;
++used;
}
}
for(int i1 = 0; i1 < seg.size(); ++i1)
{
for(int i2 = i1+1; i2 < seg.size(); ++i2)
{
for(int i3 = i2+1; i3 < seg.size(); ++i3)
{
for(int i4 = i3+1; i4 < seg.size(); ++i4)
{
print(seg[i1], 0);
print(seg[i2], 0);
print(seg[i3], 0);
print(seg[i4]);
}
}
}
}
}
else if(n == 35)
{
vector<vector<int>> seg(7, vector<int>(3));
for(int i = 0; i < seg.size(); ++i)
{
for(int j = 0; j < seg[0].size(); ++j)
{
seg[i][j] = used;
++used;
}
}
for(int i1 = 0; i1 < seg.size(); ++i1)
{
for(int i2 = i1+1; i2 < seg.size(); ++i2)
{
for(int i3 = i2+1; i3 < seg.size(); ++i3)
{
for(int i4 = i3+1; i4 < seg.size(); ++i4)
{
print(seg[i1], 0);
print(seg[i2], 0);
print(seg[i3], 0);
print(seg[i4]);
}
}
}
}
}
else if(n == 28)
{
vector<vector<int>> seg(8, vector<int>(2));
for(int i = 0; i < seg.size(); ++i)
{
for(int j = 0; j < seg[0].size(); ++j)
{
seg[i][j] = used;
++used;
}
}
for(int i1 = 0; i1 < seg.size(); ++i1)
{
for(int i2 = i1+1; i2 < seg.size(); ++i2)
{
for(int i3 = i2+1; i3 < seg.size(); ++i3)
{
for(int i4 = i3+1; i4 < seg.size(); ++i4)
{
for(int i5 = i4+1; i5 < seg.size(); ++i5)
{
for(int i6 = i5+1; i6 < seg.size(); ++i6)
{
print(seg[i1], 0);
print(seg[i2], 0);
print(seg[i3], 0);
print(seg[i4], 0);
print(seg[i5], 0);
print(seg[i6]);
}
}
}
}
}
}
}
}
bool chmin(int &a, int b)
{
bool r = a > b;
a = min(a,b);
return r;
}
int main()
{
int n;
cin >> n;
map<int,int> vc;
vc[1] = 12;
vc[2] = 24;
vc[3] = 18;
vc[4] = 16;
vc[5] = 15;
vc[6] = 24;
vc[7] = 14;
vc[10] = 20;
vc[13] = 13;
vc[15] = 18;
vc[28] = 16;
vc[35] = 21;
vector<int> dp(51, inf);
dp[0] = 0;
vector<vector<int>> ans(51);
for(int i = 1; i <= 50; ++i)
{
for(auto [val, c] : vc)
{
if(i >= val)
{
if(chmin(dp[i], dp[i-val]+c))
{
ans[i] = ans[i-val];
ans[i].push_back(val);
}
}
}
}
for(auto i : ans[n]) make(i);
}