#include <stdio.h>
#define size 46341
int pri[size],prime[size],ans[1000010],in[1000010],pcnt,left,right,minl,maxl,maxr,minr,mn,mx,anscnt,start,end;
//选出46341以内的素数
void Generate()
{
int i,j;
for(i=2;i<size;i++)
{
pri[i]=1;
}
for(i=2;i<size;i++)
{
if(!pri[i])
{
continue;
}
for(j=i*i;j<size;j+=i)
{
pri[j]=0;
}
}
pcnt=0;
for(i=2;i<size;i++)
{
if(pri[i])
{
prime[pcnt++]=i;//prime数组存储46341以内的素数,pcnt为prime存储的数据个数
}
}
}
void GetPrime()
{
int i,j;
anscnt=0;
if(right<size)
{
for(i=left;i<=right;i++)
{
if(pri[i])
{
ans[anscnt++]=i;//ans==prime
}
}
}
else
{
end=right-left+1;
for(i=0;i<end;i++)
{
in[i]=1;
}
for(i=0;i<pcnt;i++)
{
start=left/prime[i]*prime[i];//start>=prime[i]&&start=x*prime[i]
if(start<left)
{
start+=prime[i];
}
start-=left;//映射到数组下标
for(j=start;j<end;j+=prime[i])
{
in[j]=0;
}
}
for(i=0;i<end;++i)
{
if(in[i])
{
ans[anscnt++]=i+left;//ans=prime[i]+x
}
}
}
}
void Choose()
{
int i;
mn=ans[1]-ans[0];
mx=ans[1]-ans[0];
minl=maxl=ans[0];
minr=maxr=ans[1];
for(i=1;i<anscnt;i++)
{
if(ans[i]-ans[i-1]<mn)
{
mn=ans[i]-ans[i-1];
minl=ans[i-1];
minr=ans[i];
}
if(ans[i]-ans[i-1]>mx)
{
mx=ans[i]-ans[i-1];
maxl=ans[i-1];
maxr=ans[i];
}
}
}
void Accept()
{
Generate();
for(;scanf("%d%d",&left,&right)==2;)
{
GetPrime();
Choose();
if(anscnt<2)
{
printf("There are no adjacent primes.\n");
}
else
{
printf("%d,%d are closest, %d,%d are most distant.\n",minl,minr,maxl,maxr);
}
}
}
int main()
{
Accept();
return 0;
}