using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        //var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
        //Console.SetOut(sw);

        checked
        {
            var K = sc.ReadInt();
            var list = new List<long>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

            while (true)
            {
                if (list.Count() >= K)
                {
                    Console.WriteLine(list[K - 1]);
                    return;
                }
                else
                {
                    K -= list.Count();
                    var nextList = new List<long>();
                    foreach (var now in list)
                    {
                        var d = now % 10;
                        var next = now * 10;
                        if (d > 0)
                        {
                            nextList.Add(next + d - 1);
                        }
                        nextList.Add(next + d);
                        if (d != 9)
                        {
                            nextList.Add(next + d + 1);
                        }


                        //if (d == 1 || d == 9)
                        //{
                        //    nextList.Add(next);
                        //}
                        //else
                        //{
                        //    nextList.Add(next + (d - 1));
                        //}
                        //if (d != 9) nextList.Add(next + d);
                        //if (d != 9)
                        //{
                        //    nextList.Add(next + (d + 1));
                        //}
                        //else
                        //{
                        //    nextList.Add(next + (d - 1));
                        //}
                        //if (d == 9) nextList.Add(next + d);
                    }
                    list = nextList.OrderBy(c => c).ToList();
                    //Console.WriteLine(string.Join(" ", list));
                }
            }
        }


        //Console.Out.Flush();
    }

    static bool check(long x)
    {
        var keta = DigitCount(x);
        var prev = Digit(x, 0);
        var ok = true;
        for (int i = 1; i < keta; i++)
        {
            var now = Digit(x, i);
            if (Math.Abs(now - prev) != 1)
            {
                return false;
            }
            prev = now;
        }
        return ok;
    }

    static int DigitCount(long num)
    {
        int digit = 1;
        for (long i = num; i >= 10; i /= 10)
        {
            digit++;
        }
        return digit;
    }

    static int Digit(long n, int d)
    {
        return (int)(n % (long)Math.Pow(10, d + 1) / (long)Math.Pow(10, d));
    }

    class Debug
    {
        public static void Dump<T>(T[,] array)
        {
#if !DEBUG
        return;
#endif
            Console.WriteLine();
            var h = array.GetLength(0);
            var w = array.GetLength(1);

            for (int r = 0; r < h; r++)
            {
                for (int c = 0; c < w; c++)
                {
                    Console.Write(array[r, c]);
                    Console.Write(" ");
                }
                Console.WriteLine();
            }
            Console.WriteLine();
        }
        public static void Dump<T>(T[] array)
        {
#if !DEBUG
        return;
#endif
            Console.WriteLine();
            Console.WriteLine(string.Join(" ", array));
            Console.WriteLine();
        }
    }
    //static int K;
    //static int[,] DP = new int[20, 10]; // d桁目に頭がiの数
    //static void Rec(int d, int sum = 0)
    //{
    //    if (d + 1 == 20) return;
    //    var s = 0;
    //    for (int i = 1; i < 10; i++)
    //    {
    //        DP[d + 1, i] = DP[d, i - 1] + 1;
    //        DP[d + 1, i - 1] = DP[d, (i + 1) % 10] + 1;
    //        DP[]
    //        if (i == 1) DP[d + 1, i - 1]--;
    //    }

    //    Rec(d + 1);
    //}


    static Scanner sc = new Scanner();
}

class Scanner
{
    string[] S = new string[0];
    int Index = 0;
    char[] Separators = new char[] { ' ' };

    public string Next()
    {
        if (this.Index < this.S.Length) return this.S[this.Index++];
        var line = "";
        while (line == "") line = Console.ReadLine();
        this.S = line.Split(this.Separators, StringSplitOptions.RemoveEmptyEntries);
        if (this.S.Length == 0) return this.Next();
        this.Index = 0;
        return this.S[this.Index++];
    }
    public string ReadStr()
    {
        return this.Next();
    }
    public char ReadChar()
    {
        return this.Next()[0];
    }
    public int ReadInt()
    {
        return int.Parse(this.Next());
    }
    public uint ReadUInt()
    {
        return uint.Parse(this.Next());
    }
    public long ReadLong()
    {
        return long.Parse(this.Next());
    }
    public double ReadDouble()
    {
        return double.Parse(this.Next());
    }
    public Tuple<int, int> ReadTup(int add = 0)
    {
        return Tuple.Create(this.ReadInt() + add, this.ReadInt() + add);
    }
    public Tuple<long, long> ReadTupLong(int add = 0)
    {
        return Tuple.Create(this.ReadLong() + add, this.ReadLong() + add);
    }
    public Tuple<int, int, int> ReadTup3(int add = 0)
    {
        return Tuple.Create(this.ReadInt() + add, this.ReadInt() + add, this.ReadInt() + add);
    }
    public Tuple<int, int, int, int> ReadTup4(int add = 0)
    {
        return Tuple.Create(this.ReadInt() + add, this.ReadInt() + add, this.ReadInt() + add, this.ReadInt() + add);
    }
    public int[] ReadIntArray(int n)
    {
        var array = new int[n];
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = this.ReadInt();
        }
        return array;
    }
    public long[] ReadLongArray(int n)
    {
        var array = new long[n];
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = this.ReadLong();
        }
        return array;
    }
    public double[] ReadDoubleArray(int n)
    {
        var array = new double[n];
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = this.ReadDouble();
        }
        return array;
    }
    public char[] ReadCharArray(int n)
    {
        var array = new char[n];
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = this.ReadChar();
        }
        return array;
    }
    public string[] ReadStrArray(int n)
    {
        var array = new string[n];
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = this.ReadStr();
        }
        return array;
    }
    public Tuple<long, long>[] ReadTupLongArray(int n, int add = 0)
    {
        var array = new Tuple<long, long>[n];
        for (int i = 0; i < n; i++)
        {
            array[i] = this.ReadTupLong(add);
        }
        return array;
    }
    public Tuple<int, int>[] ReadTupArray(int n, int add = 0)
    {
        var array = new Tuple<int, int>[n];
        for (int i = 0; i < n; i++)
        {
            array[i] = this.ReadTup(add);
        }
        return array;
    }
    public Tuple<int, int, int>[] ReadTup3Array(int n, int add = 0)
    {
        var array = new Tuple<int, int, int>[n];
        for (int i = 0; i < n; i++)
        {
            array[i] = this.ReadTup3(add);
        }
        return array;
    }
    public Tuple<int, int, int, int>[] ReadTup4Array(int n, int add = 0)
    {
        var array = new Tuple<int, int, int, int>[n];
        for (int i = 0; i < n; i++)
        {
            array[i] = this.ReadTup4(add);
        }
        return array;
    }
}


Measured memory_bytes: 24288