#include<stdio.h>
using namespace std;

int x,y;
long long d[1000555];
bool nzd[1000555];

int get(int r, int c) {
    return r*y+c;
}

int main() {

    freopen("vojnici.in", "r", stdin);
    freopen("vojnici.out", "w", stdout);

    int n,i,j,r,c,l,k,pr,pc,resx,resy;
    long long s,res;

    scanf("%d", &n);

    resx = 1;
    resy = n;
    res = (2*(n-2) + 2);

    for(i=2; i*i<=n; i++) if (n % i == 0) {

        x = i; y = n/i;

        for(j=0; j<=n; j++) { d[j]=0; nzd[j]=true; }

        for(r=1; r<x; r++) {
            for(c=1; c<y; c++) {
                //d[get(r,c)] = d[get(r-1,c)] + d[get(r,c-1)] - d[get(r-1,c-1)] + ( nzd[get(r,c)] == true );
                d[r*y+c] = d[(r-1)*y + c] + d[r*y + c-1] - d[(r-1)*y + c-1] + ( nzd[r*y+c] == true );

                for(k=2; k*r < x && k*c < y; k++) {
                    nzd[ k*r*y + k*c ] = false;
                }
            }
        }

        s=0;
        for(r=0; r<x; r++) {
            for(c=0; c<y; c++) {
                s+=4;
                if (r==0) s--;
                if (r==x-1) s--;
                if (c==0) s--;
                if (c==y-1) s--;
                //s += d[get(r,c)] + d[get(x-r,c)] + d[get(r,y-c)] + d[get(x-r,y-c)];
                s += d[r*y+c] + d[(x-r)*y + c] + d[r*y + y-c] + d[(x-r)*y + y-c];
            }
        }

        if (s > res) {
            resx=x; resy=y;
            res=s;
        }
    }

    printf("%d %d %I64d\n", resx, resy, res);

    return 0;
}


