Problem: Aaron is a vicious criminal. He has repeatedly committed crimes (2 shoplifting, 16 peeping, 256 underwear thieves, 65,536 escapes), but has continued to escape from the police with his extraordinary physical abilities. Bruce is a police officer. Although he does not have outstanding athletic ability, he enjoys photography and has the skill to publish his photographs in magazines.

One day Bruce came to take a picture in the mountains. Then I happened to find Aaron's hideout. As Bruce chased Aaron, who escaped, they fell into a pit and wandered into ancient ruins.

The ancient ruins consist of several rooms and passages connecting the rooms. When there are M rooms in the ancient ruins, the rooms in the ruins are numbered from 0 to M-1 respectively.

Aaron thought that it might expire while he was escaping, so he moved through the ruins so that he could continue to escape for the longest time when Bruce moved optimally. Bruce wants to photograph Aaron quickly, so he moves through the ruins so that Bruce can be photographed the fastest when Aaron moves optimally.

Aaron and Bruce act in turn. The first is Aaron's turn. In each turn, you can move to or stay in one of the adjacent rooms. When Aaron and Bruce enter the same room, Bruce shall photograph Aaron.

Find out how long it will take Bruce to shoot Aaron. Time is expressed in terms of the number of turns, and when both Aaron and Bruce have acted once, it is counted as one turn.

For example, in the situation shown in Fig. 5, if Aaron escapes to room 5, Bruce will reach it in 4 turns, but if Aaron escapes to room 7, Bruce will take 5 turns to reach it. For Aaron, the answer is 5 turns because he can escape for the longest time by escaping to room 7.

An example where Aaron can continue to escape for 5 turns.
---
Figure 5: An example where Aaron keeps escaping for 5 turns.

Also, in the situation shown in Fig. 6, Aaron can escape forever by moving the room away from Bruce.

An example of Aaron being able to escape forever.
---
Figure 6: An example of Aaron being able to escape forever.



Input

The first line of input is given the number N (0 <N ≤ 100), which represents the number of datasets. The next line is followed by N datasets.

Each dataset consists of the shape of ancient ruins and the initial positions of Aaron and Bruce. First, the number of rooms in the ancient ruins M (2 ≤ M ≤ 50) is given. Next, a matrix with the number of elements M × M is given. The element of each matrix is ​​0 or 1, and if the jth number in row i is 1, it means that room i and room j are connected by a passage (however, the row and column numbers of the matrix). Counts from 0). The values ​​of the (i, j) and (j, i) components of the matrix are always equal, and the value of the (i, i) component is 0. Then two integers a and b are given. Each integer indicates the room number at the initial position of Aaron (0 ≤ a <M) and the room number at the initial position of Bruce (0 ≤ b <M). The values ​​of a and b are always different.

Output

For each dataset, print in one line how many turns Bruce will take to shoot Aaron. If you can't shoot no matter how much, output "` infinity` ".

Example

Input

6
8
0 1 0 0 0 0 0 0
1 0 1 0 0 0 0 0
0 1 0 1 1 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 1 1 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 1
0 0 0 0 0 0 1 0
3 0
4
0 1 1 0
1 0 0 1
1 0 0 1
0 1 1 0
1 0
5
0 1 0 1 0
1 0 0 1 0
0 0 0 0 1
1 1 0 0 0
0 0 1 0 0
2 0
5
0 1 0 0 1
1 0 1 1 1
0 1 0 1 0
0 1 1 0 1
1 1 0 1 0
2 4
5
0 1 0 1 0
1 0 1 1 0
0 1 0 0 1
1 1 0 0 1
0 0 1 1 0
3 0
5
0 1 0 1 1
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
1 1 0 1 0
0 4


Output

5
infinity
infinity
2
infinity
1

Solution (in CPP):

Solution:
#include<iostream>
#include<queue>
using namespace std;
#include<iostream>
#include<cstdlib>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define fir first
#define sec second

const int N = 100;
const int inf =(1<<25);
enum{A=0,B=1};
enum{WIN=1,LOSE=0,UNKNOWN=-1};
class st{
public:
  bool who;//previous move
  int a,b;
  int cost;
};

int win[2][N][N];
int deg[2][N][N];
int cost[2][N][N];
int hoge[2][N][N];
vector<int> edge[N];
int revdeg[N];

void solve(int n,int ta,int tb){
  rep(j,n)rep(k,n){
    cost[A][j][k]=0,cost[B][j][k]=0;
    win[A][j][k]=win[B][j][k]=UNKNOWN;
    hoge[A][j][k]=hoge[B][j][k]=0;
  }

  //dge ini
  rep(i,n){
    rep(j,n){
      deg[A][i][j]=revdeg[j];
      deg[B][i][j]=revdeg[i];
    }
  }

  //initial state
  queue<st> Q;
  rep(i,n){
    win[A][i][i]=LOSE;
    cost[A][i][i]=0;
    Q.push((st){A,i,i,0});
  }

  while(!Q.empty()){
    st now = Q.front();Q.pop();
    //    cout <<"now " <<  now.who <<" " << now.a <<" " << now.b << " " << win[now.who][now.a][now.b] <<" " << cost[now.who][now.a][now.b]<< endl;
    int cur=now.who==A?now.a:now.b;
    
    rep(i,edge[cur].size()){
      bool nexw=!now.who;
      int  next=edge[cur][i];
      int  nexa=now.who==A?next:now.a;
      int  nexb=now.who==B?next:now.b;
      hoge[nexw][nexa][nexb]++;
      if (win[nexw][nexa][nexb] != UNKNOWN)continue;
      
      if (now.who==A){
	cost[nexw][nexa][nexb]=max(cost[nexw][nexa][nexb],now.cost+1);
      }
      
      deg[nexw][nexa][nexb]--;
      if (win[now.who][now.a][now.b] == LOSE){//B only
	cost[nexw][nexa][nexb]=now.cost+1;
	win[nexw][nexa][nexb]=WIN;
	Q.push((st){nexw,nexa,nexb,now.cost+1});
      }else if (deg[nexw][nexa][nexb] == 0){
	//A only
	win[nexw][nexa][nexb]=LOSE;
	cost[nexw][nexa][nexb]=now.cost+1;
	Q.push((st){nexw,nexa,nexb,now.cost+1});
      }
    }
  }
  
  //cout <<"test " <<  A <<" " << ta <<" " << tb <<" deg " << deg[A][ta][tb]<<" cost " << cost[A][ta][tb] <<  endl;
//   cout <<"tmp " 
//        << cost[A][7][7] << " "
//        << cost[B][7][6]<<" "
//        << cost[A][6][4] << " "
//        << cost[B][6][2]<<" "
//        << cost[A][4][2]<<" "
//        << cost[B][4][1]<<" " 
//        << cost[A][2][1]<<" " 
//        << cost[B][2][0]<<" "
//        << cost[A][3][0]
//        << endl;

//   rep(i,n){
//     rep(j,n){
//       cout <<i<<" " << j << " " << 
// 	cost[A][i][j]<<" " << 
// 	cost[B][i][j] << endl;
//     }
//   }

  if (win[A][tb][ta]==LOSE)cout << cost[A][tb][ta]/2<<endl;
  else cout << "infinity"<<endl;
}

int main(){
  int te;
  cin>>te;
  while(te--){
    int n;
    cin>>n;
    rep(i,n)edge[i].clear(),revdeg[i]=0;
    rep(i,n){
      rep(j,n){
	bool a;cin>>a;
	if (a){
	  edge[i].push_back(j);
	  revdeg[j]++;
	}	
      }
      edge[i].push_back(i);
      revdeg[i]++;
    }

    int a,b;
    cin>>a>>b;
    solve(n,a,b);
  }
  return false;
}