import std.algorithm;
import std.conv;
import std.functional;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = input.front.strip.to!( int );
	
	return tuple( n );
}

int solve( in int n )
{
	// 6円未満の場合、1円*回数
	if(	n < 6 )
	{
		return n;
	}
	
	// 9円未満の場合、6円 + 1円*回数
	if( n < 9 )
	{
		return 1 + ( n - 6 );
	}
	
	// その他の場合、9円のn乗の単位の最大値と6円のn乗の単位の最大値で比較して回数が少ないほうを選ぶ
	auto su = memoize!( getMaxUnit!( 6 ) )( n );
	auto sc = 1 + memoize!solve( n - su );
	
	auto nu = memoize!( getMaxUnit!( 9 ) )( n );
	auto nc = 1 + memoize!solve( n - nu );
	
	return min( sc, nc );
}

auto getMaxUnit( int u )( in int n )
{
	auto r = 0;
	auto m = u;
	
	while( m < n )
	{
		r = m;
		m *= u;
	}
	
	return r;
}
