#include <bits/stdc++.h>
using namespace std;
struct triple {
  int x, y, dis;
  triple() {}
  triple(int X, int Y, int DIS) { x = X, y = Y, dis = DIS; }
  bool operator<(triple t) const { return dis > t.dis; }
} P[3600];
int cnt;
int low, x, ans, n;
int choice[16];
int record[16];
void dfs() {
  int i, j;
  if (x == n) {
    int sum = 0;
    for (i = 0; i < n; i++)
      for (j = i + 1; j < n; j++) {
        triple &u = P[choice[i]];
        triple &v = P[choice[j]];
        sum += (u.x - v.x) * (u.x - v.x) + (u.y - v.y) * (u.y - v.y);
      }
    if (sum > ans) {
      ans = sum;
      memcpy(record, choice, sizeof(choice));
    }
    return;
  }
  for (i = low; i < cnt; i++) {
    int tmp = low;
    low = i;
    choice[x++] = i;
    dfs();
    low = tmp;
    x--;
  }
}
int main() {
  int r, i, j;
  while (~scanf("%d%d", &n, &r)) {
    cnt = 0;
    for (i = -r; i <= r; i++)
      for (j = -r; j <= r; j++) {
        int dis = i * i + j * j;
        if (dis <= r * r) P[cnt++] = triple(i, j, dis);
      }
    sort(P, P + cnt);
    cnt = min(cnt, 30 - 2 * n);
    x = ans = 0;
    dfs();
    printf("%d\n", ans);
    for (i = 0; i < n; i++) {
      triple &u = P[record[i]];
      printf("%d %d\n", u.x, u.y);
    }
  }
  return 0;
}
