#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>

#define eps 1e-10
#define NMAX 100
#define MMAX 100
using namespace std;
typedef vector<double> vec;
typedef vector<vec> mat;
int row[NMAX+10], col[MMAX+10];
int r;
//double d;
int d[NMAX+10][NMAX+10] = {0};


mat gauss(mat A, vec b){
    /*
    行列A \in R^{m*n}の極大な正則部分行列A', rank A', det A', A'^(-1)を求める
    */
    int n = A.size();
    mat Z(n, vec(n+1));
    // Zの初期化
    for(int i=0; i<n; ++i){
        for(int j=0; j<n; ++j){
            Z[i][j] = A[i][j];
        }
        Z[i][n] = b[i];
    }

    r = 0;
    while(r < n){
        double z_pq = Z[r][r];
        int p = r, q = r;
        for(int i=r; i<n; ++i){
            for(int j=r; j<n; ++j){
                if(abs(z_pq) < abs(Z[i][j])){
                    z_pq = Z[i][j];
                    p = i;
                    q = j;
                }
            }
        }
        if(abs(z_pq) < eps){
            break;
        }

        if(p != r){
            for(int j=0; j<n+1; ++j){
                swap(Z[p][j], Z[r][j]); //行pとrの交換
            }
            swap(row[p], row[r]);
        }

        if(q != r){
            for(int i=0; i<n; ++i){
                swap(Z[i][q], Z[i][r]); //列qとrの交換
            }
            swap(col[q], col[r]);
        }

        double alpha;
        for(int i=r+1; i<n; ++i){
            alpha = Z[i][r] / Z[r][r];
            for(int j=r; j<n+1; ++j){
                Z[i][j] -= alpha * Z[r][j];
            }
        }
        //d *= Z[r][r];
        r++;
    }

    for(int k=r-1; k >= 1; --k){
        for(int i=0; i<=k-1; ++i){
            double alpha = Z[i][k] / Z[k][k];
            for(int j=k; j<n+1; ++j){
                Z[i][j] -= alpha * Z[k][j];
            }
        }
    }
    for(int k=0; k<r; ++k){
        double alpha = Z[k][k];
        for(int j=0; j<n+1; ++j){
            Z[k][j] /= alpha;
        }
    }

    return Z;
}

int main(){
    while(true){
        int n, s, t;
        int q[NMAX+10];
        int a[NMAX+10][NMAX+10];
        cin>>n>>s>>t;
        if(!n && !s && !t){
            return 0;
        }
        for(int i=0; i<n; ++i){
            cin>>q[i];
        }
        for(int i=0; i<n; ++i){
            for(int j=0; j<n; ++j){
                d[i][j] = 100000000;
            }
        }
        for(int i=0; i<n; ++i){
            for(int j=0; j<n; ++j){
                cin>>a[i][j];
                if(i!=j && a[i][j]){
                    d[i][j] = a[i][j];
                }
                else if(i==j && a[i][j]==0){
                    d[i][j] = a[i][j];
                }
            }
        }
        /*for(int i=0; i<n; ++i){
            for(int j=0; j<n; ++j){
                cout<<d[i][j]<<" ";
            }
            cout<<endl;
        }*/


        for(int k=0; k<n; ++k){
            for(int i=0; i<n; ++i){
                for(int j=0; j<n; ++j){
                    d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
                }
            }
        }

        /*for(int i=0; i<n; ++i){
            for(int j=0; j<n; ++j){
                cout<<d[i][j]<<" ";
            }
            cout<<endl;
        }*/

        if(d[s-1][t-1] == 100000000){
            printf("impossible\n");
        }
        else{
            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;
                }
                b[i] = 0;
            }

            for(int i=0; i<n; ++i){
                row[i] = i;
            }
            for(int j=0; j<n; ++j){
                col[j] = j;
            }

            vector<int> deg[NMAX+10];
            for(int i=0; i<n; ++i){
                if(!q[i]){
                    for(int j=0; j<n; ++j){
                        if(a[i][j]){
                            deg[i].push_back(j);
                        }
                    }
                }
                else{
                    for(int j=0; j<n;++j){
                        if(a[i][j] == 0){
                            continue;
                        }
                        if(d[i][t-1] == a[i][j]+d[j][t-1]){
                            deg[i].push_back(j);
                        }
                    }
                }
            }
            for(int i=0; i<n; ++i){
                if(i==t-1 || d[s-1][i] == 100000000){
                    A[i][i] = 1.0;
                    b[i] = 0;
                    continue;
                }
                A[i][i] -= (double)deg[i].size();
                for(int j=0; j<deg[i].size(); ++j){
                    A[i][deg[i][j]] += 1.0;
                    b[i] -= (double)a[i][deg[i][j]];
                }
            }

            r = 0;
            /*for(int i=0; i<n;++i){
                for(int j=0; j<n; ++j){
                    cout<<A[i][j]<<" ";
                }
                cout<<b[i]<<endl;
            }*/
            mat B = gauss(A, b);
            /*for(int i=0; i<n; ++i){
                for(int j=0; j<n+1; ++j){
                    printf("%.5lf ", B[i][j]);
                }
                cout<<endl;
            }*/
            for(int i=0; i<n; ++i){
                if(col[i] == s-1){
                    printf("%.10lf\n", B[i][n]);
                }
            }
        }
    }

    

    return 0;
}


Measured memory_bytes: 3344