#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <string>
#include <algorithm>
#include <iostream>
#include <string>
#include <map>
#include <set>
#include <cmath>
#include <functional>
#include <iostream>
#define INF 100000000
#define EPS 1e-10
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int n,s,t;
int q[101];
int a[101][101];
int dist[101];
vector<P> G[101];

void dijk(){
	for(int i=0;i<n;i++){
		dist[i]=INF;
	}
	dist[t]=0;
	priority_queue<P,vector<P>,greater<P> > que;
	que.push(P(0,t));
	while(que.size()){
		P p=que.top();
		que.pop();
		int v=p.second;
		if(p.first>dist[v])continue;
		for(int i=0;i<G[v].size();i++){
			if(dist[G[v][i].first]>dist[v]+G[v][i].second){
				dist[G[v][i].first]=dist[v]+G[v][i].second;
				que.push(P(dist[G[v][i].first],G[v][i].first));
			}
		}
	}
}

typedef vector<double> vec;
typedef vector<vec> mat;

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];
		}
	}
	for(int i=0;i<N;i++){
		B[i][N]=b[i];
	}
	for(int i=0;i<N;i++){
		int pivot=i;
		for(int j=i;j<N;j++){
			if(fabs(B[j][i])>fabs(B[pivot][i]))pivot=j;
		}
		swap(B[i],B[pivot]);
		if(fabs(B[i][i])<EPS)continue;
		for(int j=i+1;j<=N;j++){
			B[i][j]/=B[i][i];
		}
		for(int j=0;j<N;j++){
			if(i!=j){
				for(int k=i+1;k<=N;k++){
					B[j][k]-=B[j][i]*B[i][k];
				}
			}
		}
	}
	vec x(n);
	for(int i=0;i<n;i++){
		x[i]=B[i][n];
	}
	return x;
}

void solve(){
	dijk();
	if(dist[s]==INF){
		printf("impossible\n");
		return;
	}
	mat A(n,vec(n));
	vec B(n);
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			A[i][j]=0.0;
		}
		B[i]=0.0;
		A[i][i]=1.0;
	}
	for(int i=0;i<n;i++){
		if(i==t){
		}else if(q[i]==1){
			int best=INF;
			for(int j=0;j<G[i].size();j++){
				best=min(best,dist[G[i][j].first]+G[i][j].second);
			}
			if(best==INF)continue;
			int cnt=0;
			for(int j=0;j<G[i].size();j++){
				if(best==dist[G[i][j].first]+G[i][j].second){
					cnt++;
				}
			}
			A[i][i]=cnt;
			int sum=0;
			for(int j=0;j<G[i].size();j++){
				int nv=G[i][j].first;
				if(best==dist[nv]+G[i][j].second){
					A[i][nv]-=1;
					sum+=G[i][j].second;
				}
			}
			B[i]+=sum;
		}else{
			int cnt=(int)G[i].size();
			A[i][i]=cnt;
			if(cnt==0)continue;
			int sum=0;
			for(int j=0;j<G[i].size();j++){
				int nv=G[i][j].first;
				A[i][nv]-=1;
				sum+=G[i][j].second;
			}
			B[i]=sum;
		}
	}
	vec C=gauss_jordan(A,B);
	printf("%.15f\n",C[s]);
}

int main(void){
	while(1){
		scanf("%d%d%d",&n,&s,&t);
		if(n==0 && s==0 && t==0)break;
		s--;
		t--;
		for(int i=0;i<n;i++){
			scanf("%d",&q[i]);
		}
		for(int i=0;i<n;i++){
			G[i].clear();
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				scanf("%d",&a[i][j]);
				if(a[i][j]>0)G[i].push_back(P(j,a[i][j]));
			}
		}
		solve();
	}
	return 0;
}