#include <bits/stdc++.h>
using namespace std;
template <typename T>
T abs(T a) {
  return a < 0 ? -a : a;
}
template <typename T>
T sqr(T a) {
  return a * a;
}
const int INF = (int)1e9;
const long double EPS = 1e-9;
const long double PI = 3.1415926535897932384626433832795;
const int N = 1000;
pair<long double, long double> operator-(
    const pair<long double, long double>& a,
    const pair<long double, long double>& b) {
  return pair<long double, long double>(a.first - b.first, a.second - b.second);
}
pair<long double, long double> operator+(
    const pair<long double, long double>& a,
    const pair<long double, long double>& b) {
  return pair<long double, long double>(a.first + b.first, a.second + b.second);
}
inline pair<long double, long double> rotate(
    const pair<long double, long double>& a, const long double& ang) {
  return pair<long double, long double>(
      a.first * cos(ang) - a.second * sin(ang),
      a.first * sin(ang) + a.second * cos(ang));
}
int m;
int n;
pair<long double, long double> p[N];
vector<int> g[N];
vector<int> pol[N];
const long double ROT_ANG = 2 * PI / 5;
void draw(int cnt, int s1, int s2) {
  int cp[10];
  cp[0] = s1;
  cp[1] = s2;
  pair<long double, long double> v = p[s2] - p[s1];
  int prev = s2;
  for (int i = 0; i < int(3); ++i) {
    v = rotate(v, ROT_ANG);
    p[n] = p[prev] + v;
    cp[2 + i] = n;
    prev = n;
    n++;
  }
  v = rotate(v, ROT_ANG);
  pair<long double, long double> u = p[n - 1] + v;
  if (abs(p[s1].first - u.first) > 1e-1 || abs(p[s1].second - u.second) > 1e-1)
    throw;
  for (int i = 0; i < int(5); ++i) {
    int i1 = (i + 1) % 5;
    int i2 = (i + 4) % 5;
    for (int j = 0; j < int(5); ++j) {
      if (j != i1 && j != i && j != i2) g[cp[i]].push_back(cp[j]);
    }
  }
  for (int i = 0; i < int(5); ++i) pol[m - cnt].push_back(cp[i]);
  if (cnt > 1) {
    int i1 = 0;
    for (int i = 1; i < 5; ++i)
      if (p[cp[i1]] < p[cp[i]]) i1 = i;
    int i2 = i1 + 1;
    if (i2 == 5) i2 = 0;
    draw(cnt - 1, cp[i2], cp[i1]);
  }
}
set<pair<long double, long double> > visited;
vector<int> ans;
void fleury(int v) {
  while (!g[v].empty()) {
    int u = g[v].back();
    g[v].pop_back();
    if (visited.count(pair<long double, long double>(min(v, u), max(v, u))))
      continue;
    visited.insert(pair<long double, long double>(min(v, u), max(v, u)));
    fleury(u);
    ans.push_back(u);
  }
}
int main() {
  cin >> m;
  p[0] = pair<long double, long double>(0, 0);
  p[1] = pair<long double, long double>(10, 0);
  n = 2;
  draw(m, 0, 1);
  long double minY = 1e100, minX = 1e100;
  for (int i = 0; i < int(n); ++i) {
    minY = min(minY, p[i].second);
    minX = min(minX, p[i].first);
  }
  for (int i = 0; i < int(n); ++i) {
    p[i].first -= minX + 4999;
    p[i].second -= minY + 4999;
  }
  cout << n << endl;
  for (int i = 0; i < int(n); ++i) {
    printf("%0.10lf %0.10lf\n", (double)p[i].first, (double)p[i].second);
  }
  for (int i = 0; i < int(m); ++i) {
    for (int j = 0; j < int(5); ++j) {
      if (j != 0) printf(" ");
      printf("%d", pol[i][j] + 1);
    }
    puts("");
  }
  fleury(0);
  ans.push_back(0);
  for (int i = 0; i < int(int((ans).size())); ++i) {
    if (i != 0) printf(" ");
    printf("%d", ans[i] + 1);
  }
  puts("");
  return 0;
}
