import std.stdio;
import std.c.stdio;
import std.range;
import std.array;
import std.functional;
import std.algorithm;
import std.conv;
import std.container;
import std.math;
import std.numeric;
import std.string;
import std.c.string;
import std.regex;
import std.typecons;

long[] PrimeList(long Max) {
    long[] Ret;
    bool[] isPrime = new bool[Max + 1];
    isPrime[] = true;
    isPrime[0] = isPrime[1] = false;
    for (long i = 2; i <= Max; i++) {
        if (isPrime[i]) {
            Ret ~= i;
            for (long j = i + i; j <= Max; j += i) {
                isPrime[j] = false;
            }
        }
    }
    return Ret;
}
 
void main() {
    long M, A, B;
    
    bool input() {
        readf("%d %d %d\n", &M, &A, &B);
        if (M == 0 && A == 0 && B == 0) return false;
        return true;
    }

    const MM = 100000;
    const pList = PrimeList(MM);

    void solve() {
        //printf("%d\n", pList.length);
        long Ans[2];
        long MaxArea = 0;
        for (int i = 0; i < pList.length; i++) {
            for (int j = i; j < pList.length; j++) {
                long p = pList[i], q = pList[j];
                if (p * q > M) break;
                if (q * A > p * B) break;
                if (MaxArea < p * q) {
                    Ans[0] = p;
                    Ans[1] = q;
                    MaxArea = p * q;
                }
            }
        }
        writefln("%(%s %)", Ans);
    }

    while (input()) solve();
}