// Original C++ solution (slower):
#include <iostream>

#include <cstdio>

#include <string>

#include <vector>

#include <algorithm>

#include <functional>

#include <iomanip>

#include <stdlib.h>

#include <string.h>

#include <cstring>

#include <cmath>

#include <map>

#include <queue>

#include <deque>

#include <stack>

#include <set>

#include <stdio.h>

#include <tuple>

#include <bitset>

#include <cfloat>

#include <fstream>

#include <limits.h>

#include <list>

#include <math.h>

#include <random>

#include <unordered_map>

#include <unordered_set>

#include <bitset>

#include <numeric>

#include <utility>

#include <sstream>

#define int long long

#define rep(i, n) for (int i = 0; i < (n); i++)

#define FOR(i,a,b) for(int i=(a);i<(b);i++)

#define FORR(i,a,b)for(int i=(a);i<=(b);i++)

#define repR(i,n) for(int i=n;i>=0;i--)

#define P pair<int, int>

#define sz(x) x.size()

#define ALL(x) (x).begin(),(x).end()

#define ALLR(x) (x).rbegin(),(x).rend()

#define VE vector<int>

#define COUT(x) cout<<(x)<<endl

#define MA map<int,int>

#define SE set<int>

#define PQ priority_queue

#define COUT(x) cout<<(x)<<endl

#define YES(n) cout << ((n) ? "YES" : "NO"  ) << endl

#define Yes(n) cout << ((n) ? "Yes" : "No"  ) << endl



template<class T> inline bool chmin(T& a, T b) {

	if (a > b) {

		a = b;

		return true;

	}

	return false;

}

template<class T> inline bool chmax(T& a, T b) {

	if (a < b) {

		a = b;

		return true;

	}

	return false;

}



using namespace std;

typedef long long ll;

using Graph = vector<vector<int>>;

ll gcd(ll a, ll b) {

	if (a < b)swap(a, b);

	if (b == 0) return a;

	return gcd(b, a % b);

}

ll lcm(ll a, ll b) {

	ll g = gcd(a, b);

	return a / g * b;

}

bool prime(int n) {

	for (int i = 2; i <= sqrt(n); i++) {

		if (n%i == 0)return false;

	}

	return n != 1;

}

bool compare_by_b(pair<int, int> a, pair<int, int> b) {

	if (a.second != b.second) {

		return a.second < b.second;

	}

	else {

		return a.first < b.first;

	}

}



const long long MOD = 1000000007;

const long long INF = 1LL << 50;

// pair -> vector<pair<int,int>> 

//		   AandB.push_back(make_pair(a[i],b[i]))



int dp[100010];



signed main() {

	ios_base::sync_with_stdio(0);

	cin.tie(0);

	int n; cin >> n;

	rep(i, 100010)dp[i] = n;

	dp[0] = 0;

	FORR(i, 1, n) {

		for (int j = 1; j <= i; j *= 6) {

			chmin(dp[i], dp[i - j] + 1);

		}

		for (int j = 1; j <= i; j *= 9) {

			chmin(dp[i], dp[i - j] + 1);

		}

	}

	cout << dp[n] << endl;

	return 0;

}

// Optimized solution to the same problem (faster):
#include <iostream>

#include <cstdio>

#include <string>

#include <vector>

#include <algorithm>

#include <functional>

#include <iomanip>

#include <stdlib.h>

#include <string.h>

#include <cstring>

#include <cmath>

#include <map>

#include <queue>

#include <deque>

#include <stack>

#include <set>

#include <stdio.h>

#include <tuple>

#include <bitset>

#include <cfloat>

#include <fstream>

#include <limits.h>

#include <list>

#include <math.h>

#include <random>

#include <unordered_map>

#include <unordered_set>

#include <bitset>

#include <numeric>

#include <utility>

#include <sstream>



template<class T> inline bool chmin(T& a, T b) {

	if (a > b) {

		a = b;

		return true;

	}

	return false;

}

template<class T> inline bool chmax(T& a, T b) {

	if (a < b) {

		a = b;

		return true;

	}

	return false;

}



using namespace std;

#define int long long

#define ll long long

#define rep(i, n) for (ll i = 0; i < (n); i++)

#define FOR(i,a,b) for(ll i=(a);i<(b);i++)

#define FORR(i,a,b)for(ll i=(a);i<=(b);i++)

#define repr(i,n) for(ll i=n;i>=0;i--)

#define P pair<ll, ll>

#define sz(x) (ll)x.size()

#define ALL(x) (x).begin(),(x).end()

#define ALLR(x) (x).rbegin(),(x).rend()

#define VE vector<ll>

#define COUT(x) cout<<(x)<<endl

#define MA map<ll,ll>

#define SE set<ll>

#define PQ priority_queue<ll>

#define PQR priority_queue<ll,VE,greater<ll>>

#define COUT(x) cout<<(x)<<endl

#define YES(n) cout << ((n) ? "YES" : "NO"  ) << endl

#define Yes(n) cout << ((n) ? "Yes" : "No"  ) << endl

#define EPS (1e-10)





const long long MOD = 1000000007;

//const long long MOD = 998244353;

const long long INF = 1LL << 60;





long long modinv(long long a, long long m) {

	long long b = m, u = 1, v = 0;

	while (b) {

		long long t = a / b;

		a -= t * b; swap(a, b);

		u -= t * v; swap(u, v);

	}

	u %= m;

	if (u < 0) u += m;

	return u;

}

ll gcd(ll a, ll b) {

	if (a < b)swap(a, b);

	if (b == 0) return a;

	unsigned r;

	while ((r = a % b)) {

		a = b;

		b = r;

	}

	return b;

}

ll lcm(ll a, ll b) {

	ll g = gcd(a, b);

	return a * g / b;

}

bool prime(ll n) {

	for (ll i = 2; i <= sqrt(n); i++) {

		if (n%i == 0)return false;

	}

	return n != 1;

}









const long double PI = 3.14159265359;

const int MAX_N = 100010;











signed main() {

	ios_base::sync_with_stdio(0);

	cin.tie(0);

	int n; cin >> n;

	int ans = n;

	rep(i, n + 1) {

		int cnt = 0;

		int tmp = i;

		while (tmp > 0) {

			cnt += tmp % 6; tmp /= 6;

		}

		tmp = n - i;

		while (tmp > 0) {

			cnt += tmp % 9; tmp /= 9;

		}

		chmin(ans, cnt);

	}

	cout << ans << endl;

	return 0;

}

// Fastest known solution for this problem: