---- Quote(Alteration) ----
Queue = {}

function Queue.new()
    local obj = { buff = {}, top_index = 0}
    return setmetatable(obj,{__index = Queue})
end

function Queue:enqueue(x)
    table.insert(self.buff, x)
end

function Queue:dequeue()
    self.top_index = self.top_index + 1
    local value = self.buff[self.top_index]
    self.buff[self.top_index] = nil
    return value
end
--[[
function Queue:top()
    if #self.buff > 0 then
        return self.buff[self.top_index]
    end
end
--
function Queue:isEmpty()
    return #self.buff == 0
end
--]]
---- from http://www.nct9.ne.jp/m_hiroi/light/lua.html ----


--[[
ルンルン数の特徴:十以上の位がそれまでに出て来たルンルン数を流用している。
それゆえ、流用される側の数字の一の位に-1, 0, 1を加えた数と
流用される側の数字を10倍した数を足し、ルンルン数を生成する。
ただし、流用される側の数字の一の位の数字が0,9のときは生成しない場合を作っておく。
]]
local k = io.read("*n")
local lunluns = Queue.new()
for i = 1, 9 do
    lunluns:enqueue(i)
    if i == k then
        print(tostring(i)); os.exit()
    end
end

for i = 1, k do
    local x = 0LL + lunluns:dequeue()
    if x % 10 ~= 0 then
        lunluns:enqueue(10 * x + (x % 10) - 1)
        if #lunluns.buff == k then
            print(tostring(10 * x + (x % 10) - 1):sub(1, -3)); break
        end
    end
    lunluns:enqueue(10 * x + (x % 10))
    if #lunluns.buff == k then
        print(tostring(10 * x + (x % 10)):sub(1, -3)); break
    end
    if x % 10 ~= 9 then
        lunluns:enqueue(10 * x + (x % 10) + 1)
        if #lunluns.buff == k then
            print(tostring(10 * x + (x % 10) + 1):sub(1, -3)); break
        end
    end
end