#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void smin(T &a, U b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, U b) {
  if (a < b) a = b;
}
struct point {
  long double first, second;
  point(long double first = 0, long double second = 0)
      : first(first), second(second) {}
  point operator-(point a) { return point(first - a.first, second - a.second); }
  point operator+(point a) { return point(first + a.first, second + a.second); }
  point operator*(long double a) { return point(first * a, second * a); }
  point operator/(long double a) { return point(first / a, second / a); }
  long double operator^(point a) { return first * a.second - second * a.first; }
  long double operator*(point a) { return first * a.first + second * a.second; }
  point operator&(point a) {
    return point(first * a.first - second * a.second,
                 first * a.second + second * a.first);
  }
  point norm() {
    long double s = nor();
    if (s < 1e-8) return *this;
    return point(first / s, second / s);
  }
  long double nor() { return sqrt(*this * *this); }
  bool operator<(const point &a) const {
    if (fabs(first - a.first) > 1e-8) return first < a.first;
    return second < a.second - 1e-8;
  }
  bool operator>(const point &a) const {
    if (fabs(first - a.first) > 1e-8) return first > a.first;
    return second > a.second + 1e-8;
  }
  bool operator==(const point &a) const {
    if (fabs(first - a.first) > 1e-8) return 0;
    return fabs(second - a.second) < 1e-8;
  }
  void input() { scanf("%lf %lf", &first, &second); }
  void print() { printf("%.15lf %.15lf\n", (double)first, (double)second); }
};
point p[10010], ans[10010];
int vec[10010][5];
const long double pi = acosl(-1);
int main() {
  int n;
  scanf("%d", &n);
  printf("%d\n", 4 * n + 1);
  long double len = 20 * sinl(0.3 * pi);
  p[1] = point(len, 0);
  for (int i = 2; i < 6; i++)
    p[i] = (p[i - 1] * (-1)) & point(cosl(pi / 5), sinl(pi / 5));
  int cur = 1;
  ans[0] = point(0, 500);
  point pre = point(0, 500);
  vector<int> road;
  road.push_back(0);
  for (int i = 0; i < n; i++) {
    if (i & 1) {
      vec[i][0] = cur - 1;
      pre = ans[cur] = pre - p[1];
      cur++;
      vec[i][2] = cur - 1;
      road.push_back(cur - 1);
      pre = ans[cur] = pre - p[5];
      cur++;
      vec[i][4] = cur - 1;
      road.push_back(cur - 1);
    } else {
      vec[i][0] = cur - 1;
      pre = ans[cur] = pre + p[1];
      cur++;
      vec[i][2] = cur - 1;
      road.push_back(cur - 1);
      pre = ans[cur] = pre + p[2];
      cur++;
      vec[i][4] = cur - 1;
      road.push_back(cur - 1);
    }
  }
  int prev = cur - 1;
  for (int i = n - 1; i >= 0; i--) {
    if (i & 1) {
      vec[i][1] = cur;
      pre = ans[cur] = pre - p[4];
      cur++;
      road.push_back(cur - 1);
      vec[i][3] = cur;
      pre = ans[cur] = pre - p[3];
      cur++;
      road.push_back(cur - 1);
      pre = pre - p[2];
      road.push_back(vec[i][0]);
    } else {
      vec[i][1] = cur;
      pre = ans[cur] = pre + p[3];
      cur++;
      road.push_back(cur - 1);
      vec[i][3] = cur;
      pre = ans[cur] = pre + p[4];
      cur++;
      road.push_back(cur - 1);
      pre = pre + p[5];
      road.push_back(vec[i][0]);
    }
  }
  for (int i = 0; i < cur; i++) ans[i].print();
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 5; j++) printf("%d ", vec[i][j] + 1);
    puts("");
  }
  assert(road.size() == 5 * n + 1);
  for (int i = 0; i < road.size(); i++) printf("%d ", road[i] + 1);
  puts("");
  return 0;
}
