#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int tbl[N][N];
bool prime[N*N+1];
int m,s;
int sx,sy;
int num[N][N], lastp[N][N];

void maketbl(){
  const int dx[] = {1,0,-1,0};
  const int dy[] = {0,-1,0,1};
  int x=N/2,y=N/2;
  int t = 1;
  int d = 1;
  int dir = 0;
  while(t<=1000000){
    for(int i=0;i<d;++i){
      tbl[y][x]=t++;
      y+=dy[dir];
      x+=dx[dir];
      if(t>1000000) break;
    }
    dir = (dir+1)%4;
    if(dir%2==0) ++d;
  }
}

void solve(int x,int y){
  if(num[y][x]!=-1) return;
  if(tbl[y][x]==s){
    num[y][x] = prime[s];
    lastp[y][x] = (prime[s])?s:0;
    return;
  }
  if(abs(x-sx) > y-sy) return;
  int a1=0,a2=0;
  for(int mx=x-1;mx<=x+1;++mx){
    int my = y-1;
    if(mx<0 || mx>=N) continue;
    if(tbl[my][mx]>m) continue;
    solve(mx,my);
    if(a1 < num[my][mx]){
      a1 = num[my][mx];
      a2 = lastp[my][mx];
    }
    else if(a1 == num[my][mx]) a2 = max(a2,lastp[my][mx]);
  }
  if(prime[tbl[y][x]]){
    a1++;
    a2=tbl[y][x];
  }
  num[y][x]=a1;
  lastp[y][x]=a2;
}

int main(){
  maketbl();
  for(int i=2;i<=N*N;++i) prime[i]=true;
  for(int i=2;i<=N*N;++i) if(prime[i]) for(int j=2;i*j<=N*N;++j) prime[i*j]=false;

  while(cin>>m>>s,m||s){
    memset(num,-1,sizeof(num));
    memset(lastp,-1,sizeof(lastp));
    for(int i=0;i<N;++i)
      for(int j=0;j<N;++j)
	if(tbl[i][j]==s){
	  sx = j;
	  sy = i;
	  break;
	}
    int ans1 = 0,ans2 = 0;
    for(int j=0;j<N;++j){
      for(int i=N-1;i>=0;--i){
	if(tbl[i][j] && tbl[i][j]<=m){
	  solve(j,i);
	  if(ans1 < num[i][j]){
	    ans1 = num[i][j];
	    ans2 = lastp[i][j];
	  }
	  else if(ans1 == num[i][j])
	    ans2 = max(ans2,lastp[i][j]);
	  break;
	}
      }
    }
    cout << ans1 << " " << ans2 << endl;
  }
  return 0;
}