#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;

typedef vector<double> vec;
typedef vector<vec> mat;
const double EPS=1E-8;

vec gauss_jordan(const mat& A,const vec& b){
  int n=A.size();
  mat B(n,vec(n+1));
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)B[i][j]=A[i][j]; //n*(n+1)の配列にする。

  for(int i=0;i<n;i++)B[i][n]=b[i]; //n番目に代入

  for(int i=0;i<n;i++){
    int pivot=i;//次の基準となる添え字。
    for(int j=i;j<n;j++)if(abs(B[j][i])>abs(B[pivot][i]))pivot=j;//0以外の1つを探す
    swap(B[i],B[pivot]);//i行目に持ってくる。

    if(abs(B[i][i])<EPS)return vec();//もしも０だったら解なしまたは複数存在。
    
    for(int j=i+1;j<=n;j++)B[i][j]/=B[i][i]; //左辺をB[i][i]で両辺を割る。
    
    for(int j=0;j<n;j++){ //
      if(i!=j)//i行目-i行目はスキップ
        for(int k=i+1;k<=n;k++)B[j][k]-=B[j][i]*B[i][k];//i列の値をi列目以外を0にする。
    }
  }
  vec x(n);
  for(int i=0;i<n;i++)x[i]=B[i][n];
  return x;
}

typedef pair<int,int> P;

const int INF = 1e9;

int n, s, t, q[105], C[105][105];
int d[105];

void dijkstra(){
  
  for(int i=0;i<n;i++) d[i] = INF;
  
  priority_queue<P,vector<P>,greater<P> > Q;
  
  d[t] = 0;
  Q.push(P( 0, t ));
  
  while( !Q.empty() ){
    
    P tmp = Q.top(); Q.pop();
    
    int cost = tmp.first;
    int node = tmp.second;
    
    if( d[node] < cost ) continue;
    
    for(int i=0;i<n;i++){
      
      if( C[node][i] == 0 ) continue;
      
      int nnode = i;
      int ncost = cost + C[node][i];
      
      if( d[nnode] > ncost ){
	d[nnode] = ncost;
	Q.push(P( ncost, nnode ));
      }
      
    }
    
  }
  
}

int used[105];
set<P> memo;

void dfs(int x){
  
  if( used[x] ) return;
  used[x] = 1;
  
  for(int nx=0;nx<n;nx++){
    
    if( C[x][nx] == 0 ) continue;
    
    if( d[x] - C[x][nx] == d[nx] ){
      memo.insert( P( x, nx ) );
      dfs( nx );
    }
    
  }
  
}
/*
void dfs2(int x){
  
  if(used[x]) return;
  used[x] = 1;
  
  for(int nx=0;nx<n;nx++){
    
    if( C[x][nx] == 0 ) continue;

    dfs2(nx);
    
  }
  
  }*/

signed main(){

  while(1){
    
    memset(used,0,sizeof(used));
    memo.clear();
    
    cin>>n>>s>>t;
    if( !n && !s && !t ) break;
    
    s--, t--;
    
    int flag = 0;
    
    for(int i=0;i<n;i++){
      cin>>q[i];
      flag |= q[i];
    }
    
    //    int m = 0;
    
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++){
	cin>>C[i][j];
	//	if(i<j&&C[i][j]) m++;
      }
    
    dijkstra();
    
    if( d[s] == INF ){
      cout<<"impossible"<<endl;
      return 0;
    }
    
    for(int i=0;i<n;i++){
      
      if( used[i] == 0 ){
	
	dfs( i );

      }
      
    }
        
    mat A(n,vec(n,0));
    vec B(n,0);
    
    for(int i=0;i<n;i++){
      
      if( i == t ) continue;
      
      double cnt = 0;
      
      for(int j=0;j<n;j++){
	
	if( C[i][j] == 0 ) continue;
	
	if( q[i] == 0 ) cnt++;
	
	if( q[i] == 1 && memo.count(P( i, j )) ) cnt++;
	
      }
      
      double p = 1.0 / cnt;
      
      for(int j=0;j<n;j++){
	
	if( C[i][j] == 0 ) continue;

	if( q[i] == 0 ){
	  
	  A[i][j] = -p;
	  
	  B[i] += p * C[i][j];
	  
	}
	
	if( q[i] == 1 && memo.count(P( i, j )) ){
	  
	  A[i][j] = -p;
	  
	  B[i] += p * C[i][j];
	  
	}
	
      }
      
    }

    for(int i=0;i<n;i++) A[i][i] = 1;
    
    vec ans = gauss_jordan( A, B );
    
    /*
    if ( 20 < ans[s] && ans[s] < 21 ){

      memset(used,0,sizeof(used));
      dfs2(0);
      
      int Cnt = 0;
      
      for(int i=0;i<n;i++) Cnt += used[i];

      cout << "cnt=" << Cnt << endl;
	
      
      cout<<n<<' '<<m<<endl;
      
      cout<<endl;
      
      cout<<"flag"<<endl<<endl;
      
      for(int i=0;i<n;i++) cout<<q[i]<<' ';
      
      cout<<endl;
      cout<<endl;
      
      cout<<"G"<<endl<<endl;
      
      for(int i=0;i<n;i++){
	for(int j=0;j<n;j++){
	  if(i<j&&C[i][j]) cout<<i<<' '<<j<<endl;
	}
	cout<<endl;
      }

      cout<<endl;
      
    }
    */
    printf("%.8Lf\n", ans[s] );
    
  }
  
  return 0;
}



Measured memory_bytes: 3360