#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
typedef long long int ll;
long long GCD(long long a, long long b) {return b?GCD(b,a%b):a;}
long long LCM(long long a, long long b) {return a/GCD(a,b)*b;}
#define mmax(x,y)(x>y?x:y)
#define mmin(x,y)(x<y?x:y)
#define chmax(x,y) x=mmax(x,y)
#define chmin(x,y) x=mmin(x,y)
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};


int IsPrime(int num)
{
    if (num < 2) return 0;
    else if (num == 2) return 0;
    else if (num % 2 == 0) return 0; // 偶数はあらかじめ除く
    int i;
    double sqrtNum = sqrt(num);
    for (i = 3; i <= sqrtNum; i += 2)
    {
        if (num % i == 0)
        {
            // 素数ではない
            return 0;
        }
    }

    // 素数である
    return 1;
}

int Prime[1000010];
int ans=0;int pans=0;
int G[3000][3000];
int color[3000][3000];
int dmax[3000][3000];
void dfs(int x,int y,int d){
	if(dmax[x][y]>d)return;
	if(dmax[x][y]!=0&&dmax[x][y]==d)return;
	chmax(dmax[x][y],d);

	int i=0;
	for(i=-1;i<=1;i++){
		int nx=x+1,ny=y+i;
		if(nx>=0&&nx<3000&&ny>=0&&ny<3000){
			if(G[nx][ny]!=-1){
				if(color[nx][ny]==0){
					color[nx][ny]=1;
					if(Prime[G[nx][ny]]==0){
						d++;
						if(ans<d){
							ans=d;
							pans=G[nx][ny];
						}
						else if(ans<=d){
							chmax(pans,G[nx][ny]);
						}
					}
					dfs(nx,ny,d);
					color[nx][ny]=0;
					if(Prime[G[nx][ny]]==0)d--;
				}
			}
		}
	}
}

int main(void)
{
	int n,m;scanf("%d %d",&m,&n);
	int i,j,k;

	Prime[0]=1;Prime[1]=1;
	for(i=2;i<1000001;i++){
		if(Prime[i]==0)
		for(j=2;i*j<=1000000;j++){
			Prime[i*j]=1;
		}
	}


	while(n>0&&m>0){
		ans=0;pans=0;
		for(i=0;i<3000;i++){
			for(j=0;j<3000;j++){
				G[i][j]=-1;
			}
		}
		memset(color,0,sizeof(color));
		memset(dmax,0,sizeof(dmax));
		i=1500;j=1500;
		int now=1;int turn =0;int len=1;
		int cnt=0;
		while(m){
			//G[i][j]=now++;
			for(k=0;k<len;k++){
				G[i][j]=now++;
				if(turn==0)j++;
				else if(turn==1)i--;
				else if(turn==2)j--;
				else i++;
				m--;
				if(m<=0)break;
			}
			if(turn==0)turn =1;
			else if(turn==1)turn=2;
			else if(turn==2)turn=3;
			else turn =0;
			if(cnt==0)cnt++;
			else{
				cnt=0;
				len++;
			}
		}
		/*
		for(i=0;i<20;i++){
			for(j=0;j<20;j++){
				printf("%d  ",G[i][j]);
			}
			printf("\n");
		}
		*/
		int x=0,y=0;
		for(x=0;x<3000;x++){
			for(y=0;y<3000;y++){
				if(G[x][y]==n){
					break;
				}
			}
			if(G[x][y]==n){
				break;
			}
		}
		//printf("%d %d %d\n",x,y,n);
		int d=0;
		if(Prime[n]==0){
			d=1;
			ans=1;
			pans=n;
		}
		color[x][y]=1;
		dfs(x,y,d);
		printf("%d %d\n",ans,pans);
		scanf("%d %d",&m,&n);
	}
    return 0;
}
