#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;
const double PI = acos(-1.0);
inline double sqr(double x) { return x * x; }
inline bool zero(double x) { return x > -EPS && x < EPS; }
inline bool eq(double x, double y) { return x < y + EPS && y < x + EPS; }
inline int sgn(double x) { return x > EPS ? 1 : (x > -EPS ? 0 : -1); }
struct Point {
  double x, y;
  static Point ZERO;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  inline Point operator+(const Point& p) const {
    return Point(x + p.x, y + p.y);
  }
  inline Point operator-(const Point& p) const {
    return Point(x - p.x, y - p.y);
  }
  inline Point operator*(double k) const { return Point(x * k, y * k); }
  inline Point operator/(double k) const { return Point(x / k, y / k); }
  inline double operator*(const Point& p) const { return x * p.y - y * p.x; }
  inline double operator^(const Point& p) const { return x * p.x + y * p.y; }
  inline double len() const { return hypot(x, y); }
  inline Point trunc(double k) const { return *this * (k / len()); }
  inline Point rotate(double a) const {
    Point p(sin(a), cos(a));
    return Point(*this * p, *this ^ p);
  }
  inline bool operator<(const Point& p) const {
    return x < p.x - EPS || (x < p.x + EPS && y < p.y - EPS);
  }
  inline bool operator==(const Point& p) const {
    return eq(x, p.x) && eq(y, p.y);
  }
  inline bool operator!=(const Point& p) const {
    return !eq(x, p.x) || !eq(y, p.y);
  }
};
int n, N;
Point p[100][5];
Point ps[500];
vector<int> res;
map<Point, int> mp;
void dfs(int depth) {
  if (depth == n) {
    return;
  }
  if (depth == 0) {
    res.push_back(mp[p[0][1]]);
  }
  res.push_back(mp[p[depth][4]]);
  dfs(depth + 1);
  res.push_back(mp[p[depth][2]]);
  res.push_back(mp[p[depth][0]]);
  res.push_back(mp[p[depth][3]]);
  res.push_back(mp[p[depth][1]]);
}
int main() {
  double l1 = sqrt(200 - 200 * cos(108 * PI / 180));
  double l2 = 10.0 / sqrt(2 * (1 - cos(72 * PI / 180)));
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    Point center(-1000.0 + i * l1, 0);
    Point v(0, 1);
    for (int j = 0; j < 5; ++j) {
      p[i][j] = center + v * l2;
      v = v.rotate(72 * PI / 180);
      if (mp.find(p[i][j]) == mp.end()) {
        mp[p[i][j]] = N;
        ps[N++] = p[i][j];
      }
    }
  }
  printf("%d\n", N);
  for (int i = 0; i < N; ++i) {
    printf("%.13f %.13f\n", ps[i].x, ps[i].y);
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < 5; ++j) {
      printf("%d%c", mp[p[i][j]] + 1, j == 4 ? '\n' : ' ');
    }
  }
  dfs(0);
  for (vector<int>::const_iterator i = res.begin(); i != res.end(); ++i) {
    printf("%d%c", *i + 1, i + 1 == res.end() ? '\n' : ' ');
  }
  return 0;
}
