using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;

class Program {
    static void Main(string[] args) {
        int N;
        Input(out N);
        int[] min = new int[N / 3 + 1];
        min[0] = 0;
        for(int i = 1; i <= N / 3; i++) {
            min[i] = min[i - 1] + 3;
            for(int j = 1; j <= Log(i * 3, 6); j++) {
                int cost = min[i - (Pow(6, j) / 3)] + 1;
                if(cost < min[i]) {
                    min[i] = cost;
                    //Console.WriteLine($"{i * 3}:6^{j}:min,cost{min[i - (Pow(6, j) / 3)]}+1");
                }
            }
            for(int j = 1; j <= Log(i * 3, 9); j++) {
                int cost = min[i - (Pow(9, j) / 3)] + 1;
                if(cost < min[i]) {
                    min[i] = cost;
                    //Console.WriteLine($"{i * 3}:9^{j}:min,cost{min[i - (Pow(9, j) / 3)]}+1");
                }
                if(i == 59049 / 3) {
                    //Console.WriteLine($"59049:{cost}");
                }
            }
        }
        for(int i = 0; i <= N; i++) {
            //Console.WriteLine($"{i}:{min[i / 3] + i % 3}");
        }
        Console.WriteLine(min[N / 3] + N % 3);
    }
    static int Pow(int a, int b) {
        if(b == 0) {
            return 1;
        } else {
            if(b % 2 == 0) {
                return Pow(a * a, b / 2);
            } else {
                return a * Pow(a, b - 1);
            }
        }
    }
    static int Log(int a, int b) {
        for(int i = 0; true; i++) {
            if(a < Pow(b, i)) {
                return i - 1;
            }
        }
    }
    static T ChangeT<T>(string s) => (T)Convert.ChangeType(s, typeof(T));
    static void Input<A>(out A a) {
        var words = Console.ReadLine().Split(new[] { ' ' }, options: StringSplitOptions.RemoveEmptyEntries);
        a = ChangeT<A>(words[0]);
    }
    static void Input<A, B>(out A a, out B b) {
        var words = Console.ReadLine().Split(new[] { ' ' }, options: StringSplitOptions.RemoveEmptyEntries);
        a = ChangeT<A>(words[0]);
        b = ChangeT<B>(words[1]);
    }
    static void Input<A, B, C>(out A a, out B b, out C c) {
        var words = Console.ReadLine().Split(new[] { ' ' }, options: StringSplitOptions.RemoveEmptyEntries);
        a = ChangeT<A>(words[0]);
        b = ChangeT<B>(words[1]);
        c = ChangeT<C>(words[2]);
    }
    static void Input<A, B, C, D>(out A a, out B b, out C c, out D d) {
        var words = Console.ReadLine().Split(new[] { ' ' }, options: StringSplitOptions.RemoveEmptyEntries);
        a = ChangeT<A>(words[0]);
        b = ChangeT<B>(words[1]);
        c = ChangeT<C>(words[2]);
        d = ChangeT<D>(words[3]);
    }
    static void Input<A, B, C, D, E>(out A a, out B b, out C c, out D d, out E e) {
        var words = Console.ReadLine().Split(new[] { ' ' }, options: StringSplitOptions.RemoveEmptyEntries);
        a = ChangeT<A>(words[0]);
        b = ChangeT<B>(words[1]);
        c = ChangeT<C>(words[2]);
        d = ChangeT<D>(words[3]);
        e = ChangeT<E>(words[4]);
    }
    static void Input<A, B, C, D, E, F>(out A a, out B b, out C c, out D d, out E e, out F f) {
        var words = Console.ReadLine().Split(new[] { ' ' }, options: StringSplitOptions.RemoveEmptyEntries);
        a = ChangeT<A>(words[0]);
        b = ChangeT<B>(words[1]);
        c = ChangeT<C>(words[2]);
        d = ChangeT<D>(words[3]);
        e = ChangeT<E>(words[4]);
        f = ChangeT<F>(words[5]);
    }
    static void InputArray<T>(out T[] array) {
        array = Console.ReadLine().Split(new[] { ' ' }, options: StringSplitOptions.RemoveEmptyEntries).Select(s => ChangeT<T>(s)).ToArray();
    }
}


Measured memory_bytes: 13140