#include <bits/stdc++.h>
using namespace std;
const int MaxN = 1005;
int mp[MaxN][MaxN], n, m;
void dfs(int x, int y, int offset) {
  int cnt = m - x;
  if (cnt == 2) {
    mp[x][y] = mp[x + 2][y + 1] = offset;
    mp[x][y + 1] = mp[x + 1][y] = offset + 1;
    mp[x + 1][y + 1] = mp[x + 2][y] = offset + 2;
    return;
  }
  for (int i = 0; i < cnt; i++) mp[x][y + i] = mp[x + i + 1][y] = i + offset;
  dfs(x + 1, y + 1, offset + cnt);
}
int main() {
  while (scanf("%d", &n) == 1) {
    m = (int)sqrt(n) - 4;
    if (m < 1) m = 1;
    while (m * (m + 1) / 2 <= n) m++;
    n = m * (m - 1) / 2;
    printf("%d\n", m);
    dfs(1, 1, 1);
    for (int i = 1; i <= m; i++)
      for (int j = 1; j < m; j++)
        printf("%d%c", mp[i][j], j == m - 1 ? '\n' : ' ');
  }
  return 0;
}
