#include <stdio.h>
#include <stdbool.h>
#define N 1000000

typedef struct{
  bool ch;
  int last;
  int n;
}data;
  

bool prime[1000006]={0};
data nowmap[1505][1505]={0};
int map[1505][1505]={0};
int mapx[1000006]={0};
int mapy[1000006]={0};
//nx=x+d[i],ny=y+d[i^1]
int d[4]={0,1,0,-1};
int m,n,last=-1,maxnum;

data solve(int num);
void setprime();
void set();
void search();

int main(void){
  int i,j,k;
  data ans;
  set();
  setprime();
  while(1){
    scanf("%d %d",&m,&n);
    if(n+m==0)break;
    last = 0;
    maxnum=0;
    search();
    for(i=1;i<=m;i++)nowmap[mapx[i]][mapy[i]].ch=0;
    //printf("max%d\n",maxnum);
    ans = solve(n);
    printf("%d %d\n",ans.n,ans.last);
  }
  /*for(i=1;i<=N;i++){
    if(mapx[i]>1000||mapx[i]<0)printf("x%d %d\n",i,mapx[i]);
    if(mapy[i]>1000||mapy[i]<0)printf("y%d %d\n",i,mapy[i]);
    }*/
  return 0;
}

void set(){
  int i,j=0,nowx=500,nowy=500,count=1,dir=1;
  map[500][500]=1;
  mapx[1]=500;
  mapy[1]=500;
  for(i=1;;i++){
    for(j=1;j<=i;j++){
      nowx+=d[dir];
      nowy+=d[dir^1];
      map[nowx][nowy]=++count;
      mapx[count]=nowx;
      mapy[count]=nowy;
      //if(count==N)printf("%d %d %d %d\n",nowx,nowy,count,dir);
      if(count==N)return;
    }
    dir++;
    dir%=4;
    for(j=1;j<=i;j++){
      nowx+=d[dir];
      nowy+=d[dir^1];
      map[nowx][nowy]=++count;
      mapx[count]=nowx;
      mapy[count]=nowy;
      //if(count==N)printf("%d %d %d %d\n",nowx,nowy,count,dir);
      if(count==N)return;
    }
    dir++;
    dir%=4;
  }
}

void setprime(){
  int i,j;
  prime[0]=1;
  prime[1]=1;
  for(i=2;i<=N;i++){
    if(prime[i]==1)continue;
    for(j=2;i*j<=N;j++)prime[i*j]=1;
  }
  //for(i=0;i<=N;i++)printf("%d ",prime[i]);
}

data solve(int num){
  int x=mapx[num],y=mapy[num];
  int i,nextx=x,nexty=y+1;
  data d,rd;
  bool ch=0;
  rd.ch=1;
  rd.last=0;
  rd.n=0;
  if(nowmap[x][y].ch==1)return nowmap[x][y];
  //nowmap[x][y]=next;
  for(i=-1;i<=1;i++){
    nextx = x + i;
    if(map[nextx][nexty]==0||map[nextx][nexty]>m)continue;
    ch=1;
    d=solve(map[nextx][nexty]);
    if(rd.n<d.n||(rd.n==d.n&&rd.last<d.last)){
      rd.last=d.last;
      rd.n=d.n;
    }
  }
  if(prime[num]==0){
    rd.n++;
    if(rd.last==0)rd.last=num;
  }
  nowmap[x][y]=rd;
  return rd;
}

void search(){
  int count=0,x=mapx[n],y=mapy[n];
  while(map[x][y]<=m&&map[x][y]>=1){
    y++;
    count++;
  }
  maxnum=count+1;
}

