#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
const char lf = '\n';
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0;
  int b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
const int _ = 99, __ = _ * _;
struct points {
  long long x, y;
  points(long long x_ = 0, long long y_ = 0) { x = x_, y = y_; }
  friend points operator+(points a, points b) {
    return points(a.x + b.x, a.y + b.y);
  }
  friend points operator-(points a, points b) {
    return points(a.x - b.x, a.y - b.y);
  }
  friend points operator*(points a, long long b) {
    return points(a.x * b, a.y * b);
  }
};
inline long long dox(points a, points b) { return a.x * b.x + a.y * b.y; }
inline long long cox(points a, points b) { return a.x * b.y - a.y * b.x; }
inline long long length2(points a) { return dox(a, a); }
inline long long distan2(points a, points b) { return length2(b - a); }
int n;
long long ran;
points ps[__];
int lps = 0;
long long ans = 0;
int stk[_], lans = 0, pans[_];
void dfs(int now, int las, long long sval) {
  if (now > n) {
    if (sval <= ans) return;
    ans = sval;
    for (int i = 1; i <= n; i++) pans[i] = stk[i];
    return;
  }
  for (int i = las; i <= 18 && i <= lps; i++) {
    long long val = sval;
    stk[now] = i;
    for (int j = 1; j < now; j++) val += distan2(ps[i], ps[stk[j]]);
    dfs(now + 1, i, val);
  }
}
int main() {
  ios::sync_with_stdio(0), cout.tie(nullptr);
  n = ty(), ran = ty();
  for (int i = -ran; i <= ran; i++)
    for (int j = -ran; j <= ran; j++)
      if (length2(points(i, j)) <= ran * ran) ps[++lps] = points(i, j);
  sort(ps + 1, ps + lps + 1,
       [](points a, points b) { return length2(a) > length2(b); });
  dfs(1, 1, 0), cout << ans << lf;
  for (int i = 1; i <= n; i++)
    cout << ps[pans[i]].x << ' ' << ps[pans[i]].y << lf;
  return 0;
}
