#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
//英语 看博友分析 抄博友程序 图的数据结构 有向图的欧拉通路 没掌握
struct edge{
int v;
int nex;
int w;
}e[1000020];//抄博友程序
struct nod{
int w,head;
}st[1000020];
int adr;
int head[1000020];
void addedge(int u, int v,int w)
{
e[adr].v=v;
e[adr].w=w;
e[adr].nex=head[u];//背
head[u]=adr++;//背
}
int top;//栈
int ans[1000020],pi;
void Euler()//抄博友程序 没掌握 抄的多
{
int top=-1;
pi=0;
st[0].w=-1;
st[0].head=head[0];
top++;
while(top!=-1)
{
nod &t=st[top];
//cout<<t.w<<endl;
int i;
for(i=t.head;i!=-1;i=e[i].nex)
{
if(e[i].v!=-1)//未访问
{
int v=e[i].v;
e[i].v=-1;//已访问
top++;
st[top].w=e[i].w;
st[top].head=head[v];
break;
}
}
if(i==-1)
{
if(t.w>=0)
{
ans[pi++]=t.w+'0';
}
top--;
}
}
}
/*
void Euler()
{
int top = -1;
pi = 0;
st[0].w = -1; st[0].head = head[0];//0前面没有数字,假设是-1和0之间的边,权值-1
top++;
while(top != -1) {
nod &nt = st[top];//取栈首
int i;
for(i = nt.head; i != -1; i = e[i].nex) {
if(e[i].v != -1) {//没有拜访过
int v = e[i].v;
e[i].v = -1;//已经拜访的边,相当于vis标记
top++;
st[top].w = e[i].w;
st[top].head = head[v];
break;
}
}
if(i == -1) {
if(nt.w >= 0) ans[pi++] = nt.w + '0';
top--;
}
}
}*/
int main()
{
int n;
while(scanf("%d",&n))
{
if(n==0)
{
break;
}
if(n==1)
{
puts("0123456789");//抄博友程序 puts使用
}else
{
int m=1;
for(int i=1;i<n;i++)
{
m=m*10;
}
adr=0;
memset(head,-1,sizeof(head));
for(int i=m*10;i>=0;i--)//抄博友程序 没掌握
{
int u=i/10, v=i%m, w=i%10;
addedge(u,v,w);
}
//cout<<"hi0"<<endl;
Euler();
//cout<<"hi1"<<endl;
for(int i=1;i<n;i++)
{
ans[pi++]='0';
}
for(int i=pi-1;i>=0;i--)
{
putchar(ans[i]);
}
puts("");
}
}
return 0;
}