### constant

MAX_P = 10 ** 6
MAX_X = MAX_Y = 1003

DXYS = [[1, 0], [0, -1], [-1, 0], [0, 1]]

### subroutines

def gen_primes(max_p)
  primes = (max_p + 1).times.map{true}
  primes[0] = primes[1] = false

  s_max_p = Math.sqrt(max_p + 0.5).to_i

  for p in (2..s_max_p)
    if primes[p]
      (p * p).step(max_p, p).each{|q| primes[q] = false}
    end
  end

  primes
end

### main

primes = gen_primes(MAX_P)

cvs = MAX_Y.times.map{MAX_X.times.map{0}}
x = MAX_X / 2
y = MAX_Y / 2
cvs[x][y] = 1
drc = 3
drc0 = 0

for k in (2..MAX_P)
  x0 = x + DXYS[drc0][0]
  y0 = y + DXYS[drc0][1]
  if cvs[y0][x0] == 0
    drc = drc0
    drc0 = (drc0 + 1) % 4
  end
  x += DXYS[drc][0]
  y += DXYS[drc][1]
  cvs[y][x] = k
end
#cvs.each{|cv| puts cv.map{|c| "%3d" % c}.join(' ')}; exit

loop do
  m, n = gets.split.map(&:to_i)
  break if (m | n) == 0

  pnums = MAX_Y.times.map{MAX_X.times.map{0}}
  maxps = MAX_Y.times.map{MAX_X.times.map{0}}

  (MAX_Y - 1).downto(0).each do |y|
    for x in (0...MAX_X)
      cv = cvs[y][x]
      if cv > 0 && cv <= m
        max_pnum = maxp = 0
        y0 = y + 1
        if y0 < MAX_Y
          for x0 in ((x - 1)..(x + 1))
            next if x0 < 0 || x0 >= MAX_X
            pn0 = pnums[y0][x0]
            maxp0 = maxps[y0][x0]

            if max_pnum < pn0
              max_pnum = pn0
              maxp = maxp0
            elsif max_pnum == pn0 && maxp < maxp0
              maxp = maxp0
            end
          end
        end

        if primes[cv]
          max_pnum += 1
          maxp = cv if maxp == 0
        end

        pnums[y][x] = max_pnum
        maxps[y][x] = maxp
      end

      if cv == n
        puts [pnums[y][x], maxps[y][x]].join(' ')
        break
      end
    end
    break if cv == n
  end
end