#include<bits/stdc++.h>
using namespace std;
#define ll long long int
typedef unsigned long long int ull;
typedef long double ldb;
#define B 1000000007
#define rep(i,a,b) for(ll i=a;i<b;i++)
#define repi(i,a,b) for(ll i=b-1;i>=a;i--)
#define MT make_tuple
#define G(a,b) get<a>(b)
#define VI vector<int>
#define VLL vector<long long int>
#define pb push_back
#define mp make_pair
#define ani ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
/*SOME BITMASK KNOWLEDGE
1)x & (x - 1):sets the last one bit of x to zero
power of two exactly when x & (x − 1) = 0.
2)x & -x:sets all the one bits to zero, except last one bit
3)x | (x - 1):inverts all the bits after the last one bit
4)(a^b) = (a|b)-(a&b) = (a+b-2*(a&b))
5)(a+b) = a^b + 2*(a&b)
6)   lowest set bit of N =n ^ ( n & (n-1));
7)    Turn off 1st set bit= n^(n&(-n));
8) clear all bits from MSB to ith bit  = n&((1<<i)-1);    
9) clear all bits from LSB= n&(~((1<<(i+1))-1))      
10) if a%m<0 then compute (a%m+m)%m    */


#define endl "\n"


ll gcd(ll  a, ll  b) { 
   if (b == 0) 
      return a; 
   return gcd(b, a % b);  
} 
 
ll lcm(ll a, ll b){ 
    return (a*b)/(gcd(a, b));
}
ll max(ll a, ll b){
  if (a > b)
    return a;
  return b;
}

 
int binarySearch(int arr[], int l, int r, int x) 
{ 
    if (r >= l) { 
        int mid = l + (r - l) / 2; 
  
        // If the element is present at the middle 
        // itself 
        if (arr[mid] == x) 
            return mid; 
  
        // If element is smaller than mid, then 
        // it can only be present in left subarray 
        if (arr[mid] > x) 
            return binarySearch(arr, l, mid - 1, x); 
  
        // Else the element can only be present 
        // in right subarray 
        return binarySearch(arr, mid + 1, r, x); 
    } 
  
    // We reach here when element is not 
    // present in array 
    return -1; 
} 
 
ll nCr(ll n,ll k){ 
    ll C[n + 1][k + 1]; 
    ll i, j; 
    for (i=0;i<=n;i++){ 
        for(j=0;j<=min(i,k);j++){
            if(j==0||j==i) 
                C[i][j]=1;  
            else
                C[i][j]=C[i-1][j-1]+C[i-1][j]; 
        } 
    }
    return C[n][k]; 
} 
 
 
 ll decimalToBinary(ll N) 
{ 
  
    // To store the binary number 
    ll B_Number = 0; 
    ll cnt = 0; 
    while (N != 0) { 
        ll rem = N % 2; 
        ll c = pow(10, cnt); 
        B_Number += rem * c; 
        N /= 2; 
  
        // Count used to store exponent value 
        cnt++; 
    } 
  
    return B_Number; 
} 

std::vector<int> v;
int countFreq(string &pat, string &txt) 
{ 
    int M = pat.length(); 
    int N = txt.length(); 
    int res = 0; 
    
    /* A loop to slide pat[] one by one */
    for (int i = 0; i <= N - M; i++) 
    {  
        /* For current index i, check for  
           pattern match */
        int j; 
        for (j = 0; j < M; j++) 
            if (txt[i+j] != pat[j]) 
                break; 
   
        // if pat[0...M-1] = txt[i, i+1, ...i+M-1] 
        if (j == M)   
        {  v.pb(i);
           res++; 
           j = 0; 
        } 
    } 
    return res; 
} 


int lis(int a[],int n)
{
    int b[n];
    b[0]=1;
    for (int i = 1; i < n; ++i)
    {
        b[i]=1;
    for(int j=i-1;j>=0;j--)
    {
        if(a[j]>a[i])
            continue;
        int p=b[j]+1;
        if(p>a[i])
            a[i]=p;
    }
    }
    int best=0;
    for (int i = 0; i < n; i++) {
        if (best < b[i]) {
            best = b[i];
        }
    }
return best;
}



int count_ways_to_make_change(int s[],int m,int n)
{
    int i,j,x,y;
    int table[n+1][m];

for( i=0;i<m;i++)
{ table[0][i]=1;
}

for(i=1;i<n+1;i++)
{
    for(j=0;j<m;j++)
    {
        x=(i-s[j]>=0)?table[i-s[j]][j]:0; //count of sols including s[j]
        y=(j>=1)?table[i][j-1]:0; // count of sols excluding s[j]

        table[i][j]=x+y;  //total count
    }

}
return table[n][m-1];

}


ll kadane(ll a[],ll n)
{
    ll curr=0;
    ll best=0;
    for(ll i=0;i<n;i++)
    {
        curr+=a[i];
        if(best<curr)
        {
            best=curr;
        }
        if(curr<0)
            curr=0;
    }
    return best;
}

string decToBin(ll n) 
{ 
    if (n == 0) 
        return "0"; 
      
    // to store the binary equivalent of decimal 
    string bin = "";     
    while (n > 0)     
    { 
        // to get the last binary digit of the number 'n' 
        // and accumulate it at the beginning of 'bin' 
        bin = ((n & 1) == 0 ? '0' : '1') + bin; 
          
        // right shift 'n' by 1 
        n >>= 1; 
    } 
      
    // required binary number 
    return bin; 
} 
  

  ll binaryToDecimal(string n) 
{ 
    string num = n; 
    ll dec_value = 0; 
  
    // Initializing base value to 1, i.e 2^0 
    ll base = 1; 
  
    ll len = num.length(); 
    for (ll i = len - 1; i >= 0; i--) { 
        if (num[i] == '1') 
            dec_value += base; 
        base = base * 2; 
    } 
  
    return dec_value; 
} 

int main()
{ 
ani;
 
queue<ll> q;
ll k;cin>>k;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
q.push(6);
q.push(7);
q.push(8);
q.push(9);
ll x=0;
while(k--)
{
     x= q.front();
     q.pop();
    if((x%10)!=0)
    {
        q.push(10*x+(x%10)-1);
       
    }
    
     q.push(10*x+(x%10));
    if((x%10)!=9)
    {
        q.push(10*x+(x%10)+1);
    }



}

cout<<x;







return 0;
}

Measured memory_bytes: 1792