#include <cstdio>
#include <cstring>
#include <algorithm>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

const int dx[]={1,0,-1,0},dy[]={0,-1,0,1};

const int P_MAX=1000000;
bool er[P_MAX+1];
void sieve(){
	rep(i,P_MAX+1) er[i]=(i>=2);
	for(int i=2;i*i<=P_MAX;i++) if(er[i]) for(int j=i*i;j<=P_MAX;j+=i) er[j]=false;
}

int main(){
	sieve();

	static int B[1200][1200];
	memset(B,-1,sizeof B);
	int x=600,y=600;
	B[y][x]=1;
	for(int cnt=2,d=1;cnt<=1000000;){
		rep(i,d) B[y+=dy[0]][x+=dx[0]]=cnt++;
		rep(i,d) B[y+=dy[1]][x+=dx[1]]=cnt++;
		d++;
		rep(i,d) B[y+=dy[2]][x+=dx[2]]=cnt++;
		rep(i,d) B[y+=dy[3]][x+=dx[3]]=cnt++;
		d++;
	}

	for(int n,m;scanf("%d%d",&n,&m),n;){
		static int dp[1200][1200];
		memset(dp,-1,sizeof dp);
		rep(i,1200) rep(j,1200) if(B[i][j]==m) dp[i][j]=(er[B[i][j]]?1:0);
		for(int i=1;i<1200;i++) for(int j=1;j<1199;j++) if(B[i][j]!=-1 && B[i][j]<=n) {
			if(dp[i-1][j-1]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j-1]+(er[B[i][j]]?1:0));
			if(dp[i-1][j+0]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j+0]+(er[B[i][j]]?1:0));
			if(dp[i-1][j+1]!=-1) dp[i][j]=max(dp[i][j],dp[i-1][j+1]+(er[B[i][j]]?1:0));
		}

		int ans1=0,ans2=0;
		rep(i,1200) rep(j,1200) if(ans1<dp[i][j] || (ans1==dp[i][j] && ans2<B[i][j] && er[B[i][j]])) ans1=dp[i][j], ans2=B[i][j];
		printf("%d %d\n",ans1,ans2);
	}

	return 0;
}