#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int Runrun[10][10];


// 再起で上の桁から確定させていく
// m+2 桁のルンルン数を数えていきながら、K番目のルンルン数が何桁の何から始まるものかわかったら、
// 一つしたの桁について同様に求めていく（その時 K とその桁数に存在するルンルン数の差分が次のKになる）
// ただし接続するのは元の頭文字と差分が一つのものだけである
// 引数のKはその桁数でiからはじまる数の中で下から何番目（0leadingも含む）かを表す（つまり 0 だったらi00000 とかになるはず）
string get_ans(int K, int m, int i){
    if (m == -1){
        // 2 桁目は i ではじまるということ
        if (i == 0){
            if (K == 1){
                return "0";
            } else{
                return "1";
            }
        } else if(i == 9){
            if (K == 1){
                return "8";
            } else{
                return "9";
            }
        } else{
            if (K == 1){
                return to_string(i-1);
            } else if (K == 2){
                return to_string(i);
            } else{
                return to_string(i+1);
            }
        }
        return "something wrong";
    }

    int c = 0;
    int pre_c = c;
    if (i == 0){
        c += Runrun[0][m];
        // printf("cnt %d\n", c);
        if (K <= c){
            // printf("sub is %d\n", c - K);
            return to_string(0) + get_ans(K-pre_c, m-1, 0);
        }
        pre_c = c;
        c += Runrun[1][m];
        // printf("cnt %d\n", c);
        if (K <= c){
            // printf("sub is %d\n", c - K);
            return to_string(1) + get_ans(K-pre_c, m-1, 1);
        }
    } else if (i == 9){
        c += Runrun[8][m];
        // printf("cnt %d\n", c);
        if (K <= c){
            // printf("sub is %d\n", c - K);
            return to_string(8) + get_ans(K-pre_c, m-1, 8);
        }
        pre_c = c;
        c += Runrun[9][m];
        // printf("cnt %d" ,c);
        if (K <= c){
            // printf("sub is %d\n", c - K);
            return to_string(9) + get_ans(K-pre_c, m-1, 9);
        }
    } else{
        c += Runrun[i-1][m];
        // printf("cnt %d" ,c);
        if (K <= c){
            // printf("sub is %d, i %d\n", c - K, i-1);
            return to_string(i-1) + get_ans(K-pre_c, m-1, i-1);
        }
        pre_c = c;
        c += Runrun[i][m];
        // printf("cnt %d" ,c);
        if (K <= c){
            // printf("sub is %d i %d\n", c - K, i);
            return to_string(i) + get_ans(K-pre_c, m-1, i);
        }
        pre_c = c;
        c += Runrun[i+1][m];
        // printf("cnt %d" ,c);
        if (K <= c){
            // printf("sub is %d i %d\n", c - K, i+1);
            return to_string(i+1) + get_ans(K-pre_c, m-1, i+1);
        }
    }
    return "something wrong";
}

int main(){
    int K;
    cin >> K;
    // n で始まる m 桁のルンルン数を Runrun[n][m-2] とする
    // 冒頭に0がつく場合も計算にに必要であるためカウントしておく（ルンルン数ではない）

    int cnt = 9; // 1 ~ 9 の分

    if (K <= cnt){
        cout << K << endl;
        return 0;
    }

    Runrun[0][0] = 2; // 00, 01
    Runrun[9][0] = 2; // 98, 99
    for (int i=1; i<9; i++){
        Runrun[i][0] = 3; // i(i-1), ii, i(i+1)
    }

    for (int m=1; m<10; m++){
        Runrun[0][m] = Runrun[0][m-1] + Runrun[1][m-1];
        for (int i=1; i<9; i++){
            Runrun[i][m] = Runrun[i-1][m-1] + Runrun[i][m-1] + Runrun[i+1][m-1];
        }
        Runrun[9][m] = Runrun[8][m-1] + Runrun[9][m-1];
    }
    // for (int i=0; i<10; i++){
    //     printf("%d\n", Runrun[i][1]);
    // }
    int pre_cnt = cnt;
    for (int m=0; m<10; m++){
        for (int i=1; i<10; i++){
            pre_cnt = cnt;
            cnt += Runrun[i][m];
            // printf("keta %d, i %d, cnt %d\n", m+2, i, cnt);
            if (K <= cnt){
                // K番目のルンルン数は m+2桁で i から始まるということがわかる
                // cnt - K は、m+2桁で i から始まるルンルン数の大きい方から何番目かということを示している
                // cnt = K の場合それは一番大きいやつということになる
                // K - pre_cnt はm+2 桁でiから始まる数の下からの番号（1からスタート） ということになる
                string ans;
                if (m == 0){
                    // 2桁で最初の文字がiということまでわかっている
                    if(i == 9){
                        if (cnt - K == 0){
                            ans = "99";
                        } else{
                            ans = "98";
                        }
                    } else{
                        if (cnt - K == 0){
                            ans = to_string(i) + to_string(i+1);
                        } else if (cnt - K == 1){
                            ans = to_string(i) + to_string(i);
                        } else{
                            ans = to_string(i) + to_string(i-1);
                        }
                    }
                } else{
                    // printf("sub is %d\n", cnt-K);
                    ans = to_string(i) + get_ans(K-pre_cnt, m-1, i);
                }
                cout << ans << endl;
                return 0;
            }
        }
    }
    return 0;
}


Measured memory_bytes: 256