/*
B题
类型:动态规划,思考由后往前,代码,由前往后。。。注意边界。。。
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
using namespace std;
#define manx 1009
string x;
int z[manx];
int main(){
int n;
while(cin>>n){
char s[109];
for(int i=0;i<manx;i++) z[i]=0;
x.clear();
for(int i=0;i<n;i++){
cin>>s;
x += s[0];
}
for(int i=0;i<x.size();i++){
for(int j=i-1;j>=0;j--){
z[i]=max(z[i],z[j]);
if(x[i]==x[j] && j>=1) z[i]=max(z[i],z[j-1]+1);
if(x[i]==x[j] && j==0) z[i]=max(z[i],1);
}
}
cout<<z[x.size()-1]<<endl;
}
}
/*
4
shaoshan
erzhong
shangxia
dongmen
5
shaoshan
shangxia
ertian
erzhong
dongmen
*/
/*
G题
类型:状态压缩搜索
思路,因为状态特殊,每一个状态都可以用一个数字来代替
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
#define manx 600000
int flag,mark;
bool s[manx];
struct node{
int ans;
int temp;
};
queue<node>que;
void init(){
while(!que.empty()) que.pop();
for(int i=0;i<manx;i++) s[i]=0;
}
void bfs(int xx,int yy){
node te = que.front();
s[te.ans]=1;
while(!que.empty()){
te=que.front();
que.pop();
// cout<<te.ans<<endl;
// system("pause");
if(te.ans==mark){ flag=1; cout<<te.temp<<endl; break; }
int x[2][3];
x[0][0]=te.ans/100000%10;
x[0][1]=(te.ans/10000)%10;
x[0][2]=(te.ans/1000)%10;
x[1][0]=(te.ans/100)%10;
x[1][1]=(te.ans/10)%10;
x[1][2]=te.ans%10;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++)
if(x[i][j]==0) xx=i,yy=j;
}
if(xx+1<2){
node qe=te;
swap(x[xx][yy],x[xx+1][yy]);
qe.temp++;
int sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
sum=sum*10+x[i][j];
}
}
qe.ans=sum;
if(!s[sum]) { s[sum]=1; que.push(qe); }
swap(x[xx][yy],x[xx+1][yy]);
}
if(xx-1>=0){
node qe=te;
swap(x[xx][yy],x[xx-1][yy]);
qe.temp++;
int sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
sum=sum*10+x[i][j];
}
}
qe.ans=sum;
if(!s[sum]) { s[sum]=1; que.push(qe); }
swap(x[xx][yy],x[xx-1][yy]);
}
if(yy+1<3){
node qe=te;
swap(x[xx][yy],x[xx][yy+1]);
qe.temp++;
int sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
sum=sum*10+x[i][j];
}
}
qe.ans=sum;
if(!s[sum]) { s[sum]=1; que.push(qe); }
swap(x[xx][yy],x[xx][yy+1]);
}
if(yy-1>=0){
node qe=te;
swap(x[xx][yy],x[xx][yy-1]);
qe.temp++;
int sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
sum=sum*10+x[i][j];
}
}
qe.ans=sum;
if(!s[sum]) { s[sum]=1; que.push(qe); }
swap(x[xx][yy],x[xx][yy-1]);
}
}
}
int main(){
int t;
cin>>t;
while(t--){
init();
int a,sum=0;
flag=0;
node te;
int st,ed,val;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
scanf("%d",&val);
if(val==0) st=i,ed=j;
sum=sum*10+val;
}
}
te.ans=sum;
sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
scanf("%d",&a);
sum=sum*10+a;
}
}
mark=sum;
te.temp=0;
que.push(te);
bfs(st,ed);
if(!flag) cout<<"Impossible!"<<endl;
}
// while(1);
}
/*
2
0 1 2
3 4 5
1 2 0
3 4 5
1 2 0
4 5 3
1 2 3
4 0 5
*/