import std.stdio,std.math,std.string,std.conv,std.typecons,std.format;
import std.algorithm,std.range,std.array;
 
T[] readarr(T=long)(){return readln.chomp.split.to!(T[]);}
void scan(T...)(ref T args){auto input=readln.chomp.split;foreach(i,t;T)args[i]=input[i].to!t;}
 
//END OF TEMPLATE
 
void main(){
    ulong k;
    k.scan;
    char[] ans;
    if(k<10)
        ans=k.to!(char[]);
    else{
        ans=k.solve;
    }
    ans.writeln;
}
 
struct Queue{
    public:
    string[] list;
    auto enq(char c){list~=c.to!string;}
    auto enq(char[] c){list~=c.to!string;}
    auto deq(){auto d=list[0];list=list.length==1?[]:list[1..$];return d;}
}
 
char[] co(char c){
    if(c=='0')
        return ['0','1'];
    if('1'<=c&&c<='8')
        return [to!char(c-1),c,to!char(c+1)];
    if(c=='9')
        return ['8','9'];
    assert(0);
}
 
auto solve(ulong k){
    Queue q;
    foreach(c;'1'.to!char..('9'+1).to!char)q.enq(c);
    foreach(i;0..k-1){
        auto tmp=q.deq;
        foreach(s;tmp[$-1].co)
            q.enq(tmp.dup~s);
    }
    return q.deq.dup;
}