#include<queue>
#include<cstdio>

#define	mp	make_pair

using namespace std;

struct Dice{
	char t[3][3],s[3][3],e[3][3],w[3][3],n[3][3],b[3][3];
};

void rotx(Dice &d){
	Dice t=d;
	d.t[0][0]=t.w[2][0];	d.t[0][1]=t.w[1][0];	d.t[0][2]=t.w[0][0];
	d.t[1][0]=t.w[2][1];	d.t[1][1]=t.w[1][1];	d.t[1][2]=t.w[0][1];
	d.t[2][0]=t.w[2][2];	d.t[2][1]=t.w[1][2];	d.t[2][2]=t.w[0][2];
	d.s[0][0]=t.s[2][0];	d.s[0][1]=t.s[1][0];	d.s[0][2]=t.s[0][0];
	d.s[1][0]=t.s[2][1];	d.s[1][1]=t.s[1][1];	d.s[1][2]=t.s[0][1];
	d.s[2][0]=t.s[2][2];	d.s[2][1]=t.s[1][2];	d.s[2][2]=t.s[0][2];
	d.e[0][0]=t.t[2][0];	d.e[0][1]=t.t[1][0];	d.e[0][2]=t.t[0][0];
	d.e[1][0]=t.t[2][1];	d.e[1][1]=t.t[1][1];	d.e[1][2]=t.t[0][1];
	d.e[2][0]=t.t[2][2];	d.e[2][1]=t.t[1][2];	d.e[2][2]=t.t[0][2];
	d.w[0][0]=t.b[2][0];	d.w[0][1]=t.b[1][0];	d.w[0][2]=t.b[0][0];
	d.w[1][0]=t.b[2][1];	d.w[1][1]=t.b[1][1];	d.w[1][2]=t.b[0][1];
	d.w[2][0]=t.b[2][2];	d.w[2][1]=t.b[1][2];	d.w[2][2]=t.b[0][2];
	d.n[0][0]=t.n[0][2];	d.n[0][1]=t.n[1][2];	d.n[0][2]=t.n[2][2];
	d.n[1][0]=t.n[0][1];	d.n[1][1]=t.n[1][1];	d.n[1][2]=t.n[2][1];
	d.n[2][0]=t.n[0][0];	d.n[2][1]=t.n[1][0];	d.n[2][2]=t.n[2][0];
	d.b[0][0]=t.e[2][0];	d.b[0][1]=t.e[1][0];	d.b[0][2]=t.e[0][0];
	d.b[1][0]=t.e[2][1];	d.b[1][1]=t.e[1][1];	d.b[1][2]=t.e[0][1];
	d.b[2][0]=t.e[2][2];	d.b[2][1]=t.e[1][2];	d.b[2][2]=t.e[0][2];
}

void roty(Dice &d){
	Dice t=d;
	d.t[0][0]=t.s[0][0];	d.t[0][1]=t.s[0][1];	d.t[0][2]=t.s[0][2];
	d.t[1][0]=t.s[1][0];	d.t[1][1]=t.s[1][1];	d.t[1][2]=t.s[1][2];
	d.t[2][0]=t.s[2][0];	d.t[2][1]=t.s[2][1];	d.t[2][2]=t.s[2][2];
	d.s[0][0]=t.b[0][0];	d.s[0][1]=t.b[0][1];	d.s[0][2]=t.b[0][2];
	d.s[1][0]=t.b[1][0];	d.s[1][1]=t.b[1][1];	d.s[1][2]=t.b[1][2];
	d.s[2][0]=t.b[2][0];	d.s[2][1]=t.b[2][1];	d.s[2][2]=t.b[2][2];
	d.e[0][0]=t.e[2][0];	d.e[0][1]=t.e[1][0];	d.e[0][2]=t.e[0][0];
	d.e[1][0]=t.e[2][1];	d.e[1][1]=t.e[1][1];	d.e[1][2]=t.e[0][1];
	d.e[2][0]=t.e[2][2];	d.e[2][1]=t.e[1][2];	d.e[2][2]=t.e[0][2];
	d.w[0][0]=t.w[0][2];	d.w[0][1]=t.w[1][2];	d.w[0][2]=t.w[2][2];
	d.w[1][0]=t.w[0][1];	d.w[1][1]=t.w[1][1];	d.w[1][2]=t.w[2][1];
	d.w[2][0]=t.w[0][0];	d.w[2][1]=t.w[1][0];	d.w[2][2]=t.w[2][0];
	d.n[0][0]=t.t[2][2];	d.n[0][1]=t.t[2][1];	d.n[0][2]=t.t[2][0];
	d.n[1][0]=t.t[1][2];	d.n[1][1]=t.t[1][1];	d.n[1][2]=t.t[1][0];
	d.n[2][0]=t.t[0][2];	d.n[2][1]=t.t[0][1];	d.n[2][2]=t.t[0][0];
	d.b[0][0]=t.n[2][2];	d.b[0][1]=t.n[2][1];	d.b[0][2]=t.n[2][0];
	d.b[1][0]=t.n[1][2];	d.b[1][1]=t.n[1][1];	d.b[1][2]=t.n[1][0];
	d.b[2][0]=t.n[0][2];	d.b[2][1]=t.n[0][1];	d.b[2][2]=t.n[0][0];
}

bool canThrough(const Dice &d){
	return (d.s[2][0]=='*' || d.s[2][1]=='*' || d.s[2][2]=='*')&&(d.n[2][0]=='*' || d.n[2][1]=='*' || d.n[2][2]=='*');
}

int main(){
	while(1){
		Dice dice;
		for(int i=0;i<3;i++)for(int j=0;j<3;j++)	scanf("%c ",&dice.s[i][j]);
		for(int i=0;i<3;i++)for(int j=0;j<3;j++)	scanf("%c ",&dice.e[i][j]);
		for(int i=0;i<3;i++)for(int j=0;j<3;j++)	scanf("%c ",&dice.n[i][j]);
		for(int i=0;i<3;i++)for(int j=0;j<3;j++)	scanf("%c ",&dice.w[i][j]);
		for(int i=0;i<3;i++)for(int j=0;j<3;j++)	scanf("%c ",&dice.t[i][j]);
		for(int i=0;i<3;i++)for(int j=0;j<3;j++)	scanf("%c ",&dice.b[i][j]);
		if(dice.s[0][0]=='#')	break;

		int ans;
		queue< pair<int,Dice> > qu;	qu.push(mp(0,dice));
		while(1){
			pair<int,Dice> a=qu.front();	qu.pop();
			int cnt=a.first;
			Dice dice=a.second;
			if(canThrough(dice)){ ans=cnt; break; }

			Dice nextdice=dice;
			rotx(nextdice);
			qu.push(mp(cnt+1,nextdice));
			nextdice=dice;
			roty(nextdice);
			qu.push(mp(cnt+1,nextdice));
			nextdice=dice;
			rotx(nextdice),rotx(nextdice),rotx(nextdice);
			qu.push(mp(cnt+1,nextdice));
			nextdice=dice;
			roty(nextdice),roty(nextdice),roty(nextdice);
			qu.push(mp(cnt+1,nextdice));
		}

		printf("%d\n",ans);
	}

	return 0;
}

Measured memory_bytes: 0