import std.stdio, std.conv, std.string, std.array, std.range, std.algorithm, std.container;
import std.math, std.random, std.bigint, std.datetime, std.format;
void main(string[] args){ if(args.length > 1) if(args[1] == "-debug") DEBUG = 1; solve(); }
void log()(){ writeln(""); } void log(T, A ...)(T t, lazy A a){ if(DEBUG) write(t, " "), log(a); } bool DEBUG = 0; 
string rstring(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }
T rtype(T)(){ return rstring.to!T; } alias rint = rtype!int, rlong = rtype!long, rreal = rtype!real;
T[] rtypes(T)(int n){ return n.iota.map!(i => rtype!T()).array; } alias rint = rtypes!int, rlong = rtypes!long, rreal = rtypes!real;
T[][] rtypess(T)(int n, int m){ return n.iota.map!(i => rtypes!T(m)).array; } alias rint = rtypess!int, rlong = rtypess!long, rreal = rtypess!real;
T chmin(T)(ref T x, T y){ if(x > y) x = y; return x; } T chmax(T)(ref T x, T y){ if(x < y) x = y; return x; }

// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- //

void solve(){
	foreach(_; 0 .. rint){
		long a = rlong - 1, b = rlong - 1, c = rlong - 1, d = rlong - 1;
		
		(q(a, b, c, d) + q(b, a, d, c)).writeln;
		
	}
}

int[] f(long u){
	int[] res;
	while(u > 0){
		res ~= u % 3;
		u /= 3;
	}
	while(res.length < 30) res ~= 0;
	return res;
}

long q(long a, long b, long c, long d){
	static long[] pow3;
	if(! pow3.length){
		pow3 ~= 1;
		while(pow3.length < 30) pow3 ~= pow3[$ - 1] * 3;
	}
	
	int[] ax = f(a), bx = f(b), cx = f(c), dx = f(d);
	
	// b と d が下から見て初めて差異をもつ桁 k
	int k = 0;
	while(k < 30 && bx[k] == dx[k]) k ++;
	
	// a と c が上から見て数字が同じで最後に1だった桁 j
	int j = 29, j0 = 30;
	while(j >= 0 && ax[j] == cx[j]){
		if(ax[j] == 1){
			j0 = j;
		}
		if(j <= k) break;
		j --;
	}
	log("a:", a, "b:", b, "c:", c, "d:", d);
	log("ax:", ax);
	log("bx:", bx);
	log("cx:", cx);
	log("dx:", dx);
	log("k:", k, "j0:", j0);
	
	if(j0 >= k && j0 < 30){
		return min(
			2 + a % pow3[j0] + c % pow3[j0],
			(pow3[j0] - a % pow3[j0]) + (pow3[j0] - c % pow3[j0])
		);
	}
	else return abs(a - c);
}


/*
黒マスは三進法で見たときxとyが両方とも1である桁がある場合
（例：02112と10100は3桁目がともに1）

aとcを三進法で見て上から連続した共通部分の中に1があれば
それは黒マスのある行
それのbとdを比べて当該桁以上で差異があったらアウト
アウトというのは黒マスを迂回するということ
迂回する一番大きい黒マスの幅が3**kであるとすると

迂回部分は
2 + a % (3**k) + c % (3**k)
(3**k - a % (3**k)) + (3**k - c % (3**k))
の小さい方




*/
