#include <bits/stdc++.h>
#define rep(i, n) for(int i=0; i<(n); ++i)
#define rep2(i, s, n) for(int i=s; i<(n); ++i)
#define ALL(v) (v).begin(), (v).end()

using namespace std;

typedef long long ll;

template<typename T>
using priority_queue_rev = priority_queue<T, vector<T>, greater<T> >;

static const int INTINF = (2147483647 >> 1); // 10^9 + 5000
static const ll LLINF = (9223372036854775807 >> 1);
static const int MAX = 1e5+1;
static const ll MOD = 1e9+7;

namespace Kunitaka{
    template<
        typename TYPE,
        std::size_t SIZE
    >
    std::size_t array_length(const TYPE (&array)[SIZE])
    {
        return SIZE;
    }

    template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
    template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
}
using namespace Kunitaka;
namespace Printer{
    void br(){
        cout << endl;
    }

    void loop_cnt(int i){
        cout << "i = " << i << endl;
    }

    void loop_cnt(int i, int j){
        cout << "i = " << i << ", " << "j = " << j << endl;
    }

    template<class T>
    void print(T x){
        cout << x << endl;
    }

    template<class T, class S>
    void print(T x, S y){
        cout << x << "," << y << endl;
    }

    template<class T, class S, class U>
    void print(T x, S y, U z){
        cout << x << "," << y << "," << z << endl;
    }

    template<class T, class S>
    void print(pair<T, S> p){
        cout << p.first << ", " << p.second << endl;
    }

    template<
        typename TYPE,
        std::size_t SIZE
    >
    void print(const TYPE (&array)[SIZE]){
        int lim = array_length(array);
        for(int i=0; i<lim; i++){
            if(i) cout << " ";
            cout << array[i];
        }
        cout << endl;
    }

    template<class S>
    void print(vector<S> v){
        for(int i=0; i<v.size(); i++){
            if(i) cout << " ";
            cout<< v[i];
        }
        cout << endl;
    }

    template<class S>
    void print(vector<vector<S> > vv){
        for(int i=0; i<vv.size(); i++){
            for(int j=0; j<vv[i].size(); j++){
                if(j) cout << " ";
                cout << vv[i][j];
            }
            cout << endl;
        }
    }

    void yesno(bool x){
        if(x) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
};
using namespace Printer;

// bool detect(char a, char b){
//     int x = a -'0';
//     int y = b -'0';
//     if(a -1 == b) return true;
//     if(a == b) return true;
//     if(a +1 == b) return true;
//     return false;
// }

// ll make_runrun(ll x){
//     string str = to_string(x);

//     int k = 0;
//     rep(i, str.size()-1){
//         if(!detect(str[i], str[i+1])){
//             k = i;
//             break;
//         }
//     }

//     int a = str[k] - '0';
//     rep2(i, k, str.size()-1){
//         // k+1 ... runrurn
//         if(a < 9) a++;
//         str[i+1] = to_string(a + '0');
//     }
//     return stoi(str);
// }

// bool solve(ll mid){
//     ll x = make_runrun(mid);


// }

int main(int argc, const char * argv[]) {
    //提出時、消す----//
    //--------------//


    // input
    cout << fixed << setprecision(10);
    ll K; cin >> K;

    // ll l = -1;
    // ll r = 3234566667;

    // while(r - l > 1){
    //     ll mid = (r + l) / 2;
    //     if()
    // }

    vector<string> origin;
    vector<string> v;
    rep2(i, 1, 10){
        v.push_back(to_string(i));
    }
    origin = v;
    // print(origin);
    while(origin.size() < 1e5){
        vector<string> v2;
        for(string x : v){
            int a = x[x.size()-1] - '0' - 1; 
            int b = x[x.size()-1] - '0' + 1;
            // string n1 = x + to_string(a);
            if(a >= 0) v2.push_back(x + to_string(a ));
            if(b <= 9) v2.push_back(x + to_string(b ));
            v2.push_back(x + x[x.size()-1]);
            // if(origin.size() + v2.size() >= 1e5) break;
        }

        // v = v2;
        // v.clear();
        // for(string x : v){
        //     v.push_back(x);
        // }
        // origin += v2;
        for(string x : v2){
            origin.push_back(x);
        }
        v = v2;
    }

    vector<ll> ans;
    for(string x : origin){
        ans.push_back(stoll(x));
    }
    sort(ALL(ans));
    print(ans[K-1]);
    // rep(i, 100){
    //     if(i) cout << " ";
    //     cout << ans[i];
    // }
    // cout << endl;
    
    return 0;
}


Measured memory_bytes: 17472