#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization("unroll-loops")
using namespace std;
long long max(long long a, long long b) {
  if (a < b) return b;
  return a;
}
long long min(long long a, long long b) {
  if (a < b) return a;
  return b;
}
long long X[] = {-1, 1, 0, 0};
long long Y[] = {0, 0, -1, 1};
long long XX[] = {-1, 1, 0, 0, -1, 1, -1, 1};
long long YY[] = {0, 0, -1, 1, -1, 1, 1, -1};
long long HX[] = {1, -1, 2, -2, 1, -1, -2, 2};
long long HY[] = {2, -2, 1, -1, -2, 2, 1, -1};
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  if (b > a) return gcd(b, a);
  return gcd(a % b, b);
}
long long lcm(long long a, long long b) {
  long long val = (a * b) / gcd(a, b);
  return val;
}
string bit(long long n) {
  string s = "";
  while (n != 0) {
    long long rem = n % 2;
    n = n / 2;
    if (rem == 0) {
      s.insert(s.end(), '0');
    } else
      s.insert(s.end(), '1');
  }
  reverse(s.begin(), s.end());
  return s;
}
long long number(string s) {
  long long n = 0;
  for (int i = 0; i < s.length(); i--) {
    cout << s[i] << "\n";
    n = n * 2 + (int)(s[i] - '0');
  }
  return n;
}
struct req {
  long long l, r, len;
  req(long long a, long long b, long long c) { l = a, r = b, c = len; }
};
void solve() {
  long long n;
  cin >> n;
  long long diff = 0;
  vector<long long> v;
  if (n % 4 == 0) {
    diff = 0;
    for (int i = 1; i <= n / 2; i += 2) {
      v.push_back(i);
      v.push_back(n - i + 1);
    }
  } else if (n % 4 == 1) {
    diff = 1e17;
    vector<long long> v1, v2;
    for (int i = 1; i <= n / 2; i++) {
      v1.push_back(i);
      v2.push_back(n - i + 1);
    }
    long long mid = n / 2 + 1, ind;
    for (int i = 0; i < v1.size(); i++)
      if ((v2[i] - (mid + v1[i])) == 1) {
        diff = 1;
        ind = i;
        break;
      }
    v.push_back(v1[ind]);
    v.push_back(mid);
    long long flag = 0;
    for (int i = ind - 1; i >= 0; i--) {
      if (flag == 0) {
        v.push_back(v2[i]);
      }
      flag = 1 - flag;
    }
    flag = 0;
    for (int i = ind + 1; i < v1.size(); i++) {
      if (flag == 0) {
        v.push_back(v2[i]);
      }
      flag = 1 - flag;
    }
  } else if (n % 4 == 2) {
    diff = 1;
    for (int i = 1; i < n / 2; i += 2) {
      v.push_back(i);
      v.push_back(n - i + 1);
    }
    v.push_back(n / 2 + 1);
  } else {
    for (int i = 1; i < n / 2; i += 2) {
      v.push_back(i);
      v.push_back(n - i + 1);
    }
    long long a = n / 2, b = a + 1, c = b + 1;
    v.push_back(c);
    diff = abs(c - (a + b));
  }
  cout << diff << "\n";
  cout << v.size() << " ";
  for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
}
bool sortby(pair<long long, string> &a, pair<long long, string> &b) {
  return a.first > b.first;
}
bool correct(long long n, long long arr[]) {
  unordered_map<long long, long long> m;
  for (int i = 0; i < n; i++) m[arr[i]]++;
  for (int i = 0; i < n; i++)
    if (m[arr[i]] != 1) return false;
  return true;
}
void solve2() {
  long long n, k;
  cin >> n >> k;
  long long total = (n * (n - 1)) / 2;
  if (k >= total) {
    cout << "no solution";
    return;
  }
  long long y = 0;
  for (int i = 0; i < n; i++) {
    cout << 0 << " " << y << "\n";
    y++;
  }
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  solve2();
}
