#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

const int inf=1e8;
const double eps=1e-9;

const int MN=100;

double mat[MN+1][MN+1];
int N;

void swapRows(int i,int j){
	for(int k=0;k<=N;k++){
		swap(mat[i][k],mat[j][k]);
	}
}

void swapCols(int i,int j){
	for(int k=0;k<=N;k++){
		swap(mat[k][i],mat[k][j]);
	}
}

void sweep(int i,int j){
	if(mat[i][j]<eps) return;
	for(int k=0;k<N;k++){
		if(i==k) continue;
		if(abs(mat[k][j])>eps){
			double coe=mat[k][j]/mat[i][j];
			for(int m=0;m<=N;m++){
				mat[k][m]-=coe*mat[j][m];
			}
		}
	}
}

void toOne(int i,int j){
	if(abs(mat[i][j])<eps) return;
	double a=mat[i][j];
	for(int k=0;k<=N;k++){
		mat[i][k]/=a;
	}
}

void solve(){
	for(int i=0;i<N;i++){
		if(abs(mat[i][i])<eps){
			bool flg=false;
			for(int j=i;j<N;j++) for(int k=i;k<N;k++){
				if(abs(mat[j][k])>eps){
					flg=true;
					if(i!=j) swapRows(i,j);
					if(i!=k) swapCols(i,k);
					break;
				}
			}
			if(flg==false) break;
		}
		toOne(i,i);
		sweep(i,i);
	}
}

int g[MN][MN];
int dis[MN][MN];

bool exiSign[MN];

int main(){
	while(true){
		int S,T;
		scanf("%d%d%d",&N,&S,&T);
		if(N==0&&S==0&&T==0) break;
		S--;T--;
		for(int i=0;i<N;i++){
			for(int j=0;j<N;j++){
				dis[i][j]=inf;
			}
		}
		for(int i=0;i<N;i++){
			int in;
			scanf("%d",&in);
			if(in==0) exiSign[i]=false;
			else exiSign[i]=true;
		}
		for(int i=0;i<N;i++) for(int j=0;j<N;j++){
			scanf("%d",&g[i][j]);
			if(g[i][j]>0) dis[i][j]=g[i][j];
			if(i==j) dis[i][j]=0;
		}
		for(int k=0;k<N;k++) for(int i=0;i<N;i++) for(int j=0;j<N;j++){
			dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
		}
		if(dis[S][T]==inf){
			printf("impossible\n");
			continue;
		}
		for(int i=0;i<=N;i++) for(int j=0;j<=N;j++) mat[i][j]=0;
		for(int i=0;i<N;i++) mat[N][i]=i;
		for(int i=0;i<N;i++){
			if(i==T){
				for(int j=0;j<=N;j++) mat[i][j]=0;
				mat[i][i]=1;
				continue;
			}
			for(int j=0;j<=N;j++) mat[i][j]=0;
			for(int j=0;j<N;j++){
				if(g[i][j]==0) continue;
				if(exiSign[i]&&g[i][j]>0&&dis[i][T]!=dis[j][T]+g[i][j]) continue;
				mat[i][N]+=g[i][j];
				mat[i][j]-=1;
				mat[i][i]+=1;
			}
		}
		solve();
		double ans=0;
		for(int i=0;i<N;i++){
			if(mat[N][i]==S){
				ans=mat[i][N];
			}
		}
		printf("%.9f\n",ans);
	}
	return 0;
}