#include <bits/stdc++.h>
using namespace std;
const long long N = 100005;
void swap(long long a, long long b) { a = b; }
class Graph {
 public:
  long long V;
  map<long long, vector<long long>> adjlist;
  void addEdge(long long a, long long b, bool isbidirect = true) {
    adjlist[a].push_back(b);
    if (isbidirect) {
      adjlist[b].push_back(a);
    }
  }
  void display() {
    for (auto vertices : adjlist) {
      cout << vertices.first << " -> ";
      for (auto edges : vertices.second) {
        cout << edges << " ";
      }
      cout << endl;
    }
  }
  void bfs(long long src) {
    queue<long long> q;
    map<long long, bool> visited;
    q.push(src);
    visited[src] = true;
    while (!q.empty()) {
      long long rv = q.front();
      q.pop();
      cout << rv << " ";
      for (auto edges : adjlist[rv]) {
        if (!visited[edges]) {
          visited[edges] = true;
          q.push(edges);
        }
      }
    }
  }
  void dfs(long long src, map<long long, bool>& visited) {
    visited[src] = true;
    cout << src << " ";
    for (auto edges : adjlist[src]) {
      if (!visited[edges]) {
        dfs(edges, visited);
      }
    }
  }
  void dfshelper(long long src) {
    map<long long, bool> visited;
    dfs(src, visited);
  }
  void sssp(long long src) {
    queue<long long> q;
    map<long long, bool> visited;
    map<long long, long long> distance;
    for (auto nodes : adjlist) {
      distance[nodes.first] = INT_MAX;
    }
    distance[src] = 0;
    q.push(src);
    visited[src] = true;
    while (!q.empty()) {
      long long rv = q.front();
      q.pop();
      for (auto edges : adjlist[rv]) {
        if (distance[edges] == INT_MAX) {
          visited[edges] = true;
          distance[edges] = 1 + distance[rv];
          q.push(edges);
        }
      }
    }
    for (auto x : distance) {
      cout << x.second << " ";
    }
  }
};
void do_nothing(long long a) { a = 1; }
void seive(long long n) {
  long long a[n + 1];
  for (long long i = 3; i <= n; i += 2) a[i] = 1;
  for (long long i = 3; i <= n; i++) {
    if (a[i] == 1) {
      for (long long j = i * i; j <= n; j += 2 * i) {
        a[j] = 0;
      }
    }
  }
  a[1] = 0;
  a[2] = 1;
  for (long long i = 2; i < n; i++) {
    if (a[i] == 1) cout << i << " ";
  }
}
struct node {
  char ch;
  unordered_map<char, node*> children;
  bool isTerminal;
  node(char ch) {
    this->ch = ch;
    this->isTerminal = false;
  }
};
class Trie {
 public:
  node* root;
  Trie() { root = new node('\0'); }
  void insert(node* root, string str) {
    node* temp = root;
    for (long long i = 0; i < str.size(); i++) {
      char c = str[i];
      if (temp->children[c] == NULL) {
        node* nn = new node(c);
        temp->children[c] = nn;
        temp = nn;
      } else {
        temp = temp->children[c];
      }
    }
    temp->isTerminal = true;
  }
  bool search(node* root, string str) {
    node* temp = root;
    for (long long i = 0; i < str.size(); ++i) {
      char c = str[i];
      if (temp->children[c] == NULL) {
        return false;
      } else {
        temp = temp->children[c];
      }
    }
    return temp->isTerminal;
  }
};
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long i, j, k, n, m, ans = 0, cnt = 0, sum = 0;
  cin >> n;
  long long xx = 1;
  xx *= 2;
  xx++;
  swap(1, 1);
  do_nothing(1);
  xx = 0;
  vector<pair<long long, long long>> rv;
  swap(1, 1);
  do_nothing(1);
  for (i = 0; i < 3; i++) {
    xx *= 2;
    swap(1, 1);
    do_nothing(1);
    xx++;
    xx = 0;
    for (j = 0; j < 3; j++) {
      xx *= 2;
      xx++;
      xx = 0;
      if (i == 1 && j == 1) {
        swap(1, 1);
        do_nothing(1);
        continue;
        swap(1, 1);
        do_nothing(1);
      }
      swap(1, 1);
      do_nothing(1);
      rv.push_back({i, j});
      xx *= 2;
      xx++;
      xx = 0;
    }
  }
  long long x = 2;
  xx *= 2;
  xx++;
  xx = 0;
  swap(1, 1);
  do_nothing(1);
  long long y = 2;
  while (n--) {
    swap(1, 1);
    do_nothing(1);
    xx *= 2;
    xx++;
    xx = 0;
    for (i = x; i < x + 3; i++) {
      xx *= 2;
      xx++;
      xx = 0;
      for (j = x; j < x + 3; j++) {
        xx *= 2;
        xx++;
        xx = 0;
        if ((i == x + 1 && j == x + 1) || (i == x && j == x)) {
          swap(1, 1);
          do_nothing(1);
          continue;
        }
        xx *= 2;
        swap(1, 1);
        do_nothing(1);
        xx++;
        xx = 0;
        rv.push_back({i, j});
      }
      xx *= 2;
      xx++;
      xx = 0;
    }
    x = x + 2;
  }
  xx *= 2;
  xx++;
  xx = 0;
  cout << rv.size() << "\n";
  swap(1, 1);
  do_nothing(1);
  for (auto ele : rv) {
    swap(1, 1);
    do_nothing(1);
    xx *= 2;
    xx++;
    xx = 0;
    cout << ele.first << " " << ele.second << "\n";
  }
  return 0;
}
