#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
ll n,a[10005],ans,cnt,now=2,sum,tar,tp,ac[10005][505],cntc[10005],c[505],cntcc,temp[505];
template <typename T>
void in(T &x){
char c=getchar();
bool f=true;
for(;c<'0'||c>'9';c=getchar())
if(c=='-')
f=false;
for(x=0;c>='0'&&c<='9';c=getchar())
x=(x<<1)+(x<<3)+(c^48);
if(!f)
x=-x;
}
void putf(ll x){
if(x<0)
x=-x,putchar('-');
if(x>9)
putf(x/10);
putchar((x%10)^48);
}
int main(){
ios::sync_with_stdio(false);
in(n);
tp=n;
if(n==3){
printf("1 2\n");
printf("2");
return 0;
}
ans=1;
while(now<=n){
a[++cnt]=now;
n-=now;
now++;
}
sum=(((now-1)*now)>>1)-1;
if(sum==n){
for(ll i=1;i<=cnt;i++){
ans*=a[i];
putf(a[i]);
printf(" ");
}
putf(ans);
return 0;
}
a[++cnt]=now;
sum=((now*(now+1))>>1)-1;
tar=sum-tp-1;
for(ll i=tar;i<=cnt-1;i++)
a[i]=a[i+1];
cnt--;
for(ll i=1;i<=cnt;i++){
ans*=a[i];
putf(a[i]);
printf(" ");
while(a[i]){
ac[i][++cntc[i]]=a[i]%10;
a[i]/=10;
}
}
printf("\n");
for(ll i=1;i<=cntc[1];i++)
for(ll j=1;j<=cntc[2];j++)
c[i+j-1]=ac[1][i]*ac[2][j];
for(ll i=2;i<=cntc[1]+cntc[2];i++){
c[i]+=c[i-1]/10;
c[i-1]%=10;
}
if(c[cntc[1]+cntc[2]])
cntcc=cntc[1]+cntc[2];
else
cntcc=cntc[1]+cntc[2]-1;
for(ll i=3;i<=cnt;i++){
for(ll j=1;j<=cntcc;j++)
for(ll k=1;k<=cntc[i];k++)
temp[j+k-1]=c[j]*ac[i][k];
for(ll j=2;j<=cntcc+cntc[i];j++){
temp[j]+=temp[j-1]/10;
temp[j-1]%=10;
}
if(temp[cntcc+cntc[i]])
cntcc=cntcc+cntc[i];
else
cntcc=cntcc+cntc[i]-1;
for(ll j=1;j<=cntcc;j++)
c[j]=temp[j];
}
for(ll i=cntcc;i>=1;i--)
putf(c[i]);
return 0;
}