#include <set>
#include <cstdio>

#define REP(i,n) for(int i=0; i<(int)(n); i++)

inline int getInt(){ int s; scanf("%d", &s); return s; }

using namespace std;

int g[100][100];
int gg[100][100];
int sign[100];
int maygo[100][100];

double A[100][100];
double B[100];

int n, s, t;

const double EPS = 1e-10;
inline bool isZero(double d){ return -EPS < d && d < EPS; }

void debug(){
  REP(i,n){
    REP(j,n) printf("%.1f ", A[i][j]);
    printf("%.1f\n", B[i]);
  }
  puts("");
}

int main(){
  const int MAX = 10000000;
  while(true){
    n = getInt();
    s = getInt() - 1;
    t = getInt() - 1;

    if(n + s + t == -2) break;

    REP(i,n) sign[i] = getInt();
    REP(i,n) REP(j,n){
      gg[i][j] = g[i][j] = getInt();
      if(i != j && gg[i][j] == 0) gg[i][j] = MAX;
    }

    REP(k,n) REP(i,n) REP(j,n)
      gg[i][j] = min(gg[i][j], gg[i][k] + gg[k][j]);

    REP(i,n){
      REP(j,n) maygo[i][j] = 0;
      if(sign[i]){
        // go minimum
        int mn = MAX;
        REP(j,n) if(g[i][j])
          mn = min(mn, g[i][j] + gg[j][t]);
        REP(j,n) if(g[i][j] && mn == g[i][j] + gg[j][t])
          maygo[i][j] = 1;
      }else{
        REP(j,n) if(g[i][j])
          maygo[i][j] = 1;
      }
    }

    if(gg[s][t] != MAX){
      REP(i,n) REP(j,n) A[i][j] = 0.0;
      REP(i,n) B[i] = 0.0;

      REP(i,n){
        if(i != t){
          int cnt = 0;
          REP(j,n) if(maygo[i][j]){
            A[i][j] = -1.0;
            B[i] += g[i][j];
            cnt++;
          }
          A[i][i] = cnt;
        }else{
          A[i][i] = 1.0;
        }
      }

      // hakidasi
      REP(i,n){
        // debug();

        if(isZero(A[i][i])){
          for(int j = i + 1; j < n; j++)
            if(!isZero(A[j][i])){
              REP(k,n) swap(A[i][k], A[j][k]);
              break;
            }
        }

        if(isZero(A[i][i])) printf("test: %d\n", i);

        REP(j,n) if(i != j && !isZero(A[j][i])){
          double div = A[j][i] / A[i][i];
          REP(k,n) A[j][k] -= div * A[i][k];
          B[j] -= div * B[i];
          if(!isZero(A[j][i])) puts("test2");
        }
      }

      // debug();

      printf("%.10f\n", B[s] / A[s][s]);
    }else{
      puts("impossible");
    }
  }

  return 0;
}