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

#include <cstring>

#include <string>

#include <map>

#include <iostream>



using namespace std;



const int mov[24][6]= {

  {0,1,2,3,4,5},{0,2,4,1,3,5},{0,4,3,2,1,5},{0,3,1,4,2,5},

  {3,1,0,5,4,2},{3,0,4,1,5,2},{3,4,5,0,1,2},{3,5,1,4,0,2},

  {5,1,3,2,4,0},{5,3,4,1,2,0},{5,4,2,3,1,0},{5,2,1,4,3,0},

  {2,1,5,0,4,3},{2,5,4,1,0,3},{2,4,0,5,1,3},{2,0,1,4,5,3},

  {4,0,2,3,5,1},{4,2,5,0,3,1},{4,5,3,2,0,1},{4,3,0,5,2,1},

  {1,0,3,2,5,4},{1,3,5,0,2,4},{1,5,2,3,0,4},{1,2,0,5,3,4}

};



struct Cube {

	int num[7];

};



int n, cnt, ans;

char str[1000];

Cube c[5], now[5];

map<string,int> id;



int ID(char *st) {

	if (id[st] == 0) return id[st] = ++cnt;

	return id[st];

}



void dfs(int dep) {

	if (n == dep) {

		int ans1 = 0;

		for (int j = 0; j < 6; ++j) {

			int count[30] = {0};

			for (int i = 0; i < n; ++i) ++count[now[i].num[j]];

			int up = 0;

			for (int i = 1; i <= cnt; ++i) up = max(up, count[i]);

			ans1 += n - up;

		}

		ans = min(ans, ans1);

		return ;	

	}

	for (int i = 0; i < 24; ++i) {

		for (int j = 0; j < 6; ++j) {

			now[dep].num[j] = c[dep].num[mov[i][j]];

		}

		dfs(dep + 1);

	}

}



void Clear() {

	memset(c, 0, sizeof c);

	memset(now, 0, sizeof now);

	id.clear();

	cnt = 0;

}



int main() {

	while (1 == scanf("%d", &n)) {

		if (0 == n) break;

		Clear();

		for (int i = 0; i < n; ++i) {

			for (int j = 0; j < 6; ++j) {

				scanf("%s", str);

				c[i].num[j] = ID(str);

			}

		}

		if (1 == n) {

			puts("0");

			continue;

		}

		ans = (int)1e9;

		now[0] = c[0];

		dfs(1);

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

	}

	return 0;

}

// Optimized solution to the same problem (faster):
int dice24[24][6]=

{

	{2,1,5,0,4,3},{2,0,1,4,5,3},{2,4,0,5,1,3},{2,5,4,1,0,3},{4,2,5,0,3,1},

	{5,2,1,4,3,0},{1,2,0,5,3,4},{0,2,4,1,3,5},{0,1,2,3,4,5},{4,0,2,3,5,1},

	{5,4,2,3,1,0},{1,5,2,3,0,4},{5,1,3,2,4,0},{1,0,3,2,5,4},{0,4,3,2,1,5},

	{4,5,3,2,0,1},{1,3,5,0,2,4},{0,3,1,4,2,5},{4,3,0,5,2,1},{5,3,4,1,2,0},

	{3,4,5,0,1,2},{3,5,1,4,0,2},{3,1,0,5,4,2},{3,0,4,1,5,2},

};

#include<cstdio>

#include<cstring>

#include<string>

#include<vector>

#include<algorithm>

using namespace std;



const int maxn=4;

int n,dice[maxn][6],ans;



vector<string> names;

int  ID(const char* name)

{

	string s(name);

	int n=names.size();

	for (int i=0;i<n;i++)

	if (names[i]==s) return i;

	names.push_back(s);

	return n;

}



int r[maxn],color[maxn][6];



void check()

{

	for (int i=0;i<n;i++)

		for (int j=0;j<6;j++)

		color[i][dice24[r[i]][j]]=dice[i][j];

	int tot=0;

	for (int j=0;j<6;j++)

	{

		int cnt[maxn*6];

		memset(cnt,0,sizeof(cnt));

		int maxface=0;

		for (int i=0;i<n;i++)

			maxface=max(maxface,++cnt[color[i][j]]);

		tot+=n-maxface;

	}

	ans=min(ans,tot);

}



void dfs(int d)

{

	if (d==n) check();

	else for(int i=0;i<24;i++)

	{

		r[d]=i;

		dfs(d+1);

	}

}

int main()

{

	while (scanf("%d",&n)==1&&n)

	{

		names.clear();

		for (int i=0;i<n;i++)

			for (int j=0;j<6;j++)

			{

				char name[30];

				scanf("%s",name);

				dice[i][j]=ID(name);

			}

		ans=n*6;

		r[0]=0;

		dfs(1);

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

	}

	return 0;

}

// Fastest known solution for this problem: