#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const long long MAXR = 1e5 + 5;
const long long MAXN = 1e6 + 10;
const long long INF = 0x7f7f7f7f7f7f;
const long long MAXLEN = 1e5 + 10;
long long l, r, cnt, poi;
long long prime[MAXLEN];
long long isprime[MAXN];
bool vis[MAXLEN];
bool flag[MAXN];
void MakeSet (long long);
int main () {
MakeSet (MAXR);
while (cin >> l >> r) {
if (l == 1) l++;
memset (flag, 0, sizeof (flag)); poi = 0;
for (long long i = 1; i <= cnt; i++) {
for (long long j = l / prime[i]; j <= r / prime[i]; j++) {
if (j * prime[i] < l) continue;
if (j == 1) continue;
flag[j * prime[i] - l] = 1;
}
}
for (long long i = l; i <= r; i++) {
if (flag[i - l] == 0) isprime[++poi] = i;
}
if (poi <= 1) cout << "There are no adjacent primes." << endl;
else {
long long maxindex, maxval = -INF, minindex, minval = INF;
for (long long i = 2; i <= poi; i++) {
long long tem = isprime[i] - isprime[i - 1];
if (tem > maxval) {
maxval = tem;
maxindex = i;
}
if (tem < minval) {
minval = tem;
minindex = i;
}
}
printf ("%lld,%lld are closest, %lld,%lld are most distant.\n", isprime[minindex - 1], isprime[minindex], isprime[maxindex - 1], isprime[maxindex]);
}
}
return 0;
}
void MakeSet (long long n) {
vis[1] = 0;
for (long long i = 2; i <= n; i++) {
if (vis[i] == 0) prime[++cnt] = i;
for (long long j = 1; j <= cnt; j++) {
if (i > n / prime[j]) break;
vis[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
}