#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using Pi = pair<int, int>;
using Pl = pair<ll, ll>;
using Ti = tuple<int, int, int>;
using Tl = tuple<ll, ll, ll>;

#define pb push_back
#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define F first
#define S second
#define Get(t, i) get<(i)>((t))
#define all(v) (v).begin(), (v).end()
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
#define reps(i, f, n) for(int i = (int)(f); i < (int)(n); i++)
#define each(a, b) for(auto& a : b)

const int inf = 1 << 25;
const ll INF = 1LL << 55;

#define MAX_M 1000001
#define MAX_W 1001

bool isprim[MAX_M];

void Eratosthenes()
{
  fill(isprim, isprim + MAX_M, true);
  isprim[0] = isprim[1] = false;
  for(int i = 2; i*i < MAX_M; i++) {
    if(isprim[i]) {
      for(int j = i+i; j < MAX_M; j += i) isprim[j] = false;
    }
  }
}

int cave[MAX_W][MAX_W];
Pi pos[MAX_M];

void make_cave()
{
  const int dx[] = {1, 0, -1, 0};
  const int dy[] = {0, -1, 0, 1};  
  typedef pair<Pi, Pi> Pii;
  queue<Pii> que;
  que.push(Pii(Pi(MAX_W/2, MAX_W/2), Pi(3, 1)));
  while(!que.empty()) {
    Pii p = que.front(); que.pop();
    int x = p.F.F, y = p.F.S, d = p.S.F, n = p.S.S;
    if(n >= MAX_M) break;
    pos[n] = p.F, cave[y][x] = n++;
    int nd = (d + 1) % 4, nx = x + dx[nd], ny = y + dy[nd];
    if(!cave[ny][nx]) que.push(Pii(Pi(nx, ny), Pi(nd, n)));
    else que.push(Pii(Pi(x + dx[d], y + dy[d]), Pi(d, n)));
  }
}

int main()
{
  Eratosthenes();
  make_cave();
  int m, n;
  while(cin >> m >> n, m) {
    int dp[MAX_W][MAX_W];
    fill(dp[0], dp[MAX_W], -1);
    dp[pos[n].S][pos[n].F] = isprim[n];
    int ans = 0, num = 0;
    for(int y = 0; y < MAX_W; y++) {    
      for(int x = 0; x < MAX_W; x++) {
	if(ans <= dp[y][x]) {
	  ans = dp[y][x];
	  if(isprim[cave[y][x]]) num = max(num, cave[y][x]);
	}
	if(y == MAX_W-1 || !cave[y][x] || m < cave[y][x] || !~dp[y][x]) continue;
	for(int a = -1; a <= 1; a++) {
	  int nx = x + a, ny = y + 1;
	  if(nx < 0 || MAX_W <= nx || !cave[ny][nx] || m < cave[ny][nx]) continue;
	  dp[ny][nx] = max(dp[ny][nx], dp[y][x] + isprim[cave[ny][nx]]);
	  if(ans <= dp[ny][nx]) {
	    ans = dp[ny][nx];
	    if(isprim[cave[ny][nx]]) num = cave[ny][nx];
	  }
	}
      }
    }
    cout << ans << " " << num << endl;
  }
  return 0;
}