Problem: In order to fly to the Moon Mister B just needs to solve the following problem.

There is a complete indirected graph with n vertices. You need to cover it with several simple cycles of length 3 and 4 so that each edge is in exactly 2 cycles.

We are sure that Mister B will solve the problem soon and will fly to the Moon. Will you?

Input

The only line contains single integer n (3 ≤ n ≤ 300).

Output

If there is no answer, print -1.

Otherwise, in the first line print k (1 ≤ k ≤ n2) — the number of cycles in your solution.

In each of the next k lines print description of one cycle in the following format: first print integer m (3 ≤ m ≤ 4) — the length of the cycle, then print m integers v1, v2, ..., vm (1 ≤ vi ≤ n) — the vertices in the cycle in the traverse order. Each edge should be in exactly two cycles.

Examples

Input

3


Output

2
3 1 2 3
3 1 2 3


Input

5


Output

6
3 5 4 2
3 3 1 5
4 4 5 2 3
4 4 3 2 1
3 4 2 1
3 3 1 5

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const long long M = (1ll << 32);
const int N = 500005;
struct str {
  int a, b, c, d;
};
struct node {
  int a, b, c;
};
vector<str> ans;
vector<node> ans2;
void Out43(int a[]) {
  ans.push_back((str){a[1], a[5], a[2], a[6]});
  ans.push_back((str){a[1], a[5], a[2], a[7]});
  ans.push_back((str){a[1], a[6], a[2], a[7]});
  ans.push_back((str){a[3], a[5], a[4], a[6]});
  ans.push_back((str){a[3], a[5], a[4], a[7]});
  ans.push_back((str){a[3], a[6], a[4], a[7]});
}
void Out44(int a[]) {
  ans.push_back((str){a[1], a[5], a[2], a[6]});
  ans.push_back((str){a[1], a[5], a[2], a[6]});
  ans.push_back((str){a[1], a[7], a[2], a[8]});
  ans.push_back((str){a[1], a[7], a[2], a[8]});
  ans.push_back((str){a[3], a[5], a[4], a[6]});
  ans.push_back((str){a[3], a[5], a[4], a[6]});
  ans.push_back((str){a[3], a[7], a[4], a[8]});
  ans.push_back((str){a[3], a[7], a[4], a[8]});
}
void Out45(int a[]) {
  ans.push_back((str){a[1], a[5], a[2], a[6]});
  ans.push_back((str){a[1], a[5], a[2], a[6]});
  ans.push_back((str){a[1], a[7], a[2], a[8]});
  ans.push_back((str){a[1], a[7], a[2], a[9]});
  ans.push_back((str){a[1], a[8], a[2], a[9]});
  ans.push_back((str){a[3], a[5], a[4], a[6]});
  ans.push_back((str){a[3], a[5], a[4], a[6]});
  ans.push_back((str){a[3], a[7], a[4], a[8]});
  ans.push_back((str){a[3], a[7], a[4], a[9]});
  ans.push_back((str){a[3], a[8], a[4], a[9]});
}
void Out46(int a[]) {
  ans.push_back((str){a[1], a[5], a[2], a[6]});
  ans.push_back((str){a[1], a[5], a[2], a[6]});
  ans.push_back((str){a[1], a[7], a[2], a[8]});
  ans.push_back((str){a[1], a[7], a[2], a[8]});
  ans.push_back((str){a[1], a[9], a[2], a[10]});
  ans.push_back((str){a[1], a[9], a[2], a[10]});
  ans.push_back((str){a[3], a[5], a[4], a[6]});
  ans.push_back((str){a[3], a[5], a[4], a[6]});
  ans.push_back((str){a[3], a[7], a[4], a[8]});
  ans.push_back((str){a[3], a[7], a[4], a[8]});
  ans.push_back((str){a[3], a[9], a[4], a[10]});
  ans.push_back((str){a[3], a[9], a[4], a[10]});
}
void Out3(int a[]) {
  ans2.push_back((node){a[1], a[2], a[3]});
  ans2.push_back((node){a[1], a[2], a[3]});
}
void Out4(int a[]) {
  ans2.push_back((node){a[1], a[2], a[3]});
  ans2.push_back((node){a[1], a[2], a[4]});
  ans2.push_back((node){a[1], a[3], a[4]});
  ans2.push_back((node){a[2], a[3], a[4]});
}
void Out5(int a[]) {
  ans.push_back((str){a[2], a[3], a[4], a[5]});
  ans.push_back((str){a[2], a[3], a[4], a[5]});
  ans2.push_back((node){a[1], a[2], a[4]});
  ans2.push_back((node){a[1], a[2], a[4]});
  ans2.push_back((node){a[1], a[3], a[5]});
  ans2.push_back((node){a[1], a[3], a[5]});
}
void Out6(int a[]) {
  ans2.push_back((node){a[1], a[2], a[3]});
  ans2.push_back((node){a[1], a[2], a[4]});
  ans2.push_back((node){a[1], a[3], a[5]});
  ans2.push_back((node){a[1], a[4], a[6]});
  ans2.push_back((node){a[1], a[5], a[6]});
  ans2.push_back((node){a[2], a[3], a[6]});
  ans2.push_back((node){a[2], a[4], a[5]});
  ans2.push_back((node){a[2], a[5], a[6]});
  ans2.push_back((node){a[3], a[4], a[5]});
  ans2.push_back((node){a[3], a[4], a[6]});
}
int n, i, p[100005], k, a[15], j, m;
int main() {
  scanf("%d", &n);
  m = n;
  while (n > 6) {
    ++k;
    n -= 4;
  }
  if (n == 3) {
    a[1] = m - 2, a[2] = m - 1, a[3] = m;
    Out3(a);
    a[5] = m - 2, a[6] = m - 1, a[7] = m;
    for (i = 1; i <= k; ++i) {
      a[1] = i * 4 - 3;
      a[2] = i * 4 - 2;
      a[3] = i * 4 - 1;
      a[4] = i * 4;
      Out43(a);
    }
  }
  if (n == 4) {
    a[1] = m - 3, a[2] = m - 2, a[3] = m - 1, a[4] = m;
    Out4(a);
    a[5] = m - 3, a[6] = m - 2, a[7] = m - 1, a[8] = m;
    for (i = 1; i <= k; ++i) {
      a[1] = i * 4 - 3;
      a[2] = i * 4 - 2;
      a[3] = i * 4 - 1;
      a[4] = i * 4;
      Out44(a);
    }
  }
  if (n == 5) {
    a[1] = m - 4, a[2] = m - 3, a[3] = m - 2, a[4] = m - 1, a[5] = m;
    Out5(a);
    a[5] = m - 4, a[6] = m - 3, a[7] = m - 2, a[8] = m - 1, a[9] = m;
    for (i = 1; i <= k; ++i) {
      a[1] = i * 4 - 3;
      a[2] = i * 4 - 2;
      a[3] = i * 4 - 1;
      a[4] = i * 4;
      Out45(a);
    }
  }
  if (n == 6) {
    a[1] = m - 5, a[2] = m - 4, a[3] = m - 3, a[4] = m - 2, a[5] = m - 1,
    a[6] = m;
    Out6(a);
    a[5] = m - 5, a[6] = m - 4, a[7] = m - 3, a[8] = m - 2, a[9] = m - 1,
    a[10] = m;
    for (i = 1; i <= k; ++i) {
      a[1] = i * 4 - 3;
      a[2] = i * 4 - 2;
      a[3] = i * 4 - 1;
      a[4] = i * 4;
      Out46(a);
    }
  }
  for (i = 1; i <= k; ++i) {
    a[1] = i * 4 - 3;
    a[2] = i * 4 - 2;
    a[3] = i * 4 - 1;
    a[4] = i * 4;
    Out4(a);
  }
  for (i = 1; i <= k; ++i)
    for (j = i + 1; j <= k; ++j) {
      a[1] = i * 4 - 3;
      a[2] = i * 4 - 2;
      a[3] = i * 4 - 1;
      a[4] = i * 4;
      a[5] = j * 4 - 3;
      a[6] = j * 4 - 2;
      a[7] = j * 4 - 1;
      a[8] = j * 4;
      Out44(a);
    }
  cout << ans.size() + ans2.size() << endl;
  for (auto it : ans) printf("4 %d %d %d %d\n", it.a, it.b, it.c, it.d);
  for (auto it : ans2) printf("3 %d %d %d\n", it.a, it.b, it.c);
}