#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define baza 10
long v[102];
long s[102];
long c[102];
void add(long *a)
{
long i;
for(i=100;i>=0;i--)
if(a[i]==baza-1) a[i]=0;
else {a[i]++;break;}
}
void medie(long *a,long *b,long *c)
{
long i,rest,t;
for(i=100;i>=0;i--)
{
c[i]=a[i]+b[i]+c[i+1]/baza;
c[i+1]%=baza;
}
rest =0;
for(i=0;i<=100;i++)
{
if(c[i]%2==1) t =5;
else t =0;
c[i]=c[i]/2+rest;
rest = t;
}
}
long prod(long *a,long *b)
{
long i,j,cc;
memset(s,0,sizeof(s));
for(i=100;i>=0;i--)
if(a[i])
for(j=100;j>=1;j--)
if(b[j])
{
cc = 100 - (100-i) -(100-j);
if(cc<0) return 0;
s[cc]+=a[i]*b[j];
}
for(i=100;i>=0;i--)
{
s[i]+=s[i+1]/baza;
s[i+1]%=baza;
a[i+1] = s[i+1];
if(a[i+1]>10)
i--;
}
if(s[0]) return 0;
return 1;
}
long ver(long *a,long b)
{
long i;
long x[101];
for(i=0;i<=100;i++) x[i] = a[i];
for(i=2;i<=b;i++) if( prod(x,a)==0) return 1;
for(i=1;i<=100;i++)
{
if(x[i] > v[i])
return 1;
if(x[i]<v[i]) return -1;}
return 0;
}
void afisare(long *a,long b)
{
long i;
for(i=1;i<=100;i++)
if(a[i]) break;
for(;i<=100;i++) printf("%ld",a[i]);
printf("\n%ld",b);
exit(0);
}
long cmp(long *a,long *b)
{
long i;
for(i=1;i<=100;i++)
if(a[i] != b[i]) return 1;
return 0;
}
long cauta(long *a,long *b,long putere)
{
long w;
long c[102];
memset(c,0,sizeof(c));
if(cmp(a,b)==0) {if(ver(a,putere)==0) afisare(a,putere);return 0;}
medie(a,b,c);
w = ver(c,putere);
if(w ==0) {afisare(c,putere);}
if(w > 0 ) return cauta(a,c,putere);
else
{
add(c);
return cauta(c,b,putere);
}
}
int main()
{
long x[102],y[102];
long i,n;
char cc[102];
freopen("numere2.in","r",stdin);
freopen("numere2.out","w",stdout);
scanf("%s",cc);
n = strlen(cc);
memset(v,0,sizeof(v));
for(i=100;i>=100- n+1;i--)
v[i] = cc[n+ i-100 - 1]-'0';
for(i=355;i>=1;i--)
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
x[100] = 2;
if(ver(x,i)>0) continue;
x[100] = 1;
y[1] =1;
cauta(x,y,i);
}
return 0;
}