#include <stdio.h>
#include <algorithm>
using namespace std;
int n, m, r[1000][1000], dp1[1000][1000], dp2[1000][1000]; bool isprime[1000001];
const int dx[4] = { -1, 0, 1, 0 };
const int dy[4] = { 0, 1, 0, -1 };
int main() {
	isprime[1] = false;
	for (int i = 2; i <= 1000000; i++) isprime[i] = true;
	for (int i = 2; i <= 1000000; i++) {
		if (isprime[i]) {
			for (int j = i + i; j <= 1000000; j += i) {
				isprime[j] = false;
			}
		}
	}
	while (true) {
		scanf("%d%d", &n, &m);
		if (n == 0 && m == 0) break;
		for (int i = 0; i < 1000; i++) {
			for (int j = 0; j < 1000; j++) {
				dp1[i][j] = -1, dp2[i][j] = -1, r[i][j] = -1;
			}
		}
		int c = 2, d = 0, x = 499, y = 500;
		for (int i = 1; i <= n; i++) {
			r[y][x] = i; d++;
			x += dx[c % 4];
			y += dy[c % 4];
			if (d == c / 2) c++, d = 0;
		}
		int sx, sy;
		for (int i = 0; i < 1000; i++) {
			for (int j = 0; j < 1000; j++) {
				if (r[i][j] == m) sx = j, sy = i;
			}
		}
		dp1[sy][sx] = isprime[m] ? 1 : 0, dp2[sy][sx] = isprime[m] ? m : 0;
		int res1 = dp1[sy][sx], res2 = dp2[sy][sx];
		for (int i = sy + 1; i < 1000; i++) {
			for (int j = 0; j < 1000; j++) {
				if (r[i][j] == -1) continue;
				int s1 = -1, s2 = -1;
				for (int k = -1; k <= 1; k++) {
					if (0 <= j + k && j + k < 1000) {
						if (dp1[i - 1][j + k] != -1) {
							if (isprime[r[i][j]]) {
								s1 = max(s1, dp1[i - 1][j + k] + 1);
								s2 = r[i][j];
							}
							else {
								if (s1 < dp1[i - 1][j + k]) {
									s1 = dp1[i - 1][j + k];
									s2 = dp2[i - 1][j + k];
								}
								else if (s1 == dp1[i - 1][j + k] && s2 < dp2[i - 1][j + k]) {
									s2 = dp2[i - 1][j - k];
								}
							}
						}
					}
				}
				if (j == sx && i == sy) continue;
				dp1[i][j] = s1;
				dp2[i][j] = s2;
				if (res1 < s1) {
					res1 = s1;
					res2 = s2;
				}
				else if (res1 == s1 && res2 < s2) {
					res2 = s2;
				}
			}
		}
		printf("%d %d\n", res1, res2);
	}
	return 0;
}