#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-7;
const double PI = acos(-1.0);
const int oo = 0x7f7f7f7f;
inline int max(int a, int b) {
  if (a > b) return a;
  return b;
}
inline int min(int a, int b) {
  if (a < b) return a;
  return b;
}
template <class T>
inline T lowbit(T a) {
  return a & -a;
}
template <class T>
inline void checkmax(T &a, T b) {
  if (a < b) a = b;
}
template <class T>
inline void checkmin(T &a, T b) {
  if (a == -1 || a > b) a = b;
}
int maze[150][150];
int main(void) {
  memset(maze, 0, sizeof(maze));
  int n;
  maze[1][1] = 1;
  maze[1][2] = 2;
  maze[2][1] = 1;
  maze[2][2] = 3;
  maze[3][1] = 2;
  maze[3][2] = 3;
  scanf("%d", &n);
  int x = 3;
  int y = 3;
  while (x + y <= n) {
    x += y;
    y++;
  }
  y--;
  printf("%d\n", 2 * x / y);
  int m = 2 * x / y;
  int l = 4;
  for (int i = 3; i <= y; i++) {
    int t = 0;
    for (int j = 1; j <= y; j++) {
      t++;
      if (t == i + 1) break;
      maze[j][i] = l++;
    }
  }
  for (int i = 1; i <= 2 * x / y; i++) {
    for (int j = 1; j <= y; j++) {
      if (maze[i][j] == 0) {
        maze[i][j] = maze[j][i - 1];
      }
    }
  }
  for (int i = 1; i <= 2 * x / y; i++) {
    for (int j = 1; j <= y; j++) {
      printf("%d", maze[i][j]);
      if (j == y)
        puts("");
      else
        printf(" ");
    }
  }
  return 0;
}
