/*
TASK:crazy
LANG:C++
*/
# include <stdio.h>
# include <stdlib.h>
# include <limits.h>
# include <math.h>
# include "module.h"
# define max(a,b) (((a)>(b))? (a):(b))
# define min(a,b) (((a)<(b))? (a):(b))
# define MAXN 512

struct node{
	short w;
	int m;
	short p;
	short r;
};
node data[MAXN][MAXN];

void inin() {
	int i,j;
	for ( i=0 ; i<MAXN ; i++ )
		for ( j=0 ; j<MAXN ; j++ )
			data[i][j].w=0;
}
short g(short a, short b) {
	if ( b%a==0 ) return a;
	return g(b%a,a);
}
void f(int a, int b) {
	if ( data[a][b].w==0 ) {
		int r=0,m=0,p,i;
		data[a][b].m=INT_MAX;
		for ( i=2 ; i<a ; i++ ) {
			if ( g(i,a)!=1 ) {
				f(i,b+1);
				if ( data[i][b+1].w==-1 && data[a][b].m>data[i][b+1].m ) {
					data[a][b].w=1;
					data[a][b].m = data[i][b+1].m;
					data[a][b].r = 1;
					data[a][b].p = i;
				} else {
					if ( data[i][b+1].m>m ) {
						m = data[i][b+1].m;
						r = 1;
						p = i;
					}
				}
			}
		}
		for ( i=2 ; i<b ; i++ ) {
			if ( g(i,b)!=1 ) {
				f(a+1,i);
				if ( data[a+1][i].w==-1 && data[a][b].m>data[a+1][i].m ) {
					data[a][b].w = 1;
					data[a][b].m = data[a+1][i].m;
					data[a][b].r = 2;
					data[a][b].p = i;
				} else {
					if ( data[a+1][i].m>m ) {
						m = data[i][b+1].m;
						r = 1;
						p = i;
					}
				}
			}
		}
		if ( data[a][b].w!=1 ) {
			data[a][b].w = -1;
			data[a][b].m = m;
			data[a][b].r = r;
			data[a][b].p = p;
		}
		data[b][a] = data[a][b];
		data[b][a].r = (data[b][a].r==1)? 2:1;
	}
}
short isprime(int a) {
	int i,sq;
	sq = (int)sqrt(a)+1;
	for ( i=2 ; i<=sq ; i++ ) {
		if ( a%i==0 ) return 0;
	}
	return 1;
}
void play(long a, long b) {
	while(1) {
		if ( data[a][b].r == 1 ) {
			setnum(data[a][b].p,b+1);
			if ( isprime(data[a][b].p)==1 && isprime(b+1)==1 ) exit(0);
			getnum(&a,&b);
		} else {
			setnum(a+1,data[a][b].p);
			if ( isprime(data[a][b].p)==1 && isprime(a+1)==1 ) exit(0);
			getnum(&a,&b);
		}
	}
}
int main() {
	long a,b;
	inin();
	getnum(&a,&b);
	f(a,b);
	play(a,b);
	return 0;
}
