#include<bits/stdc++.h>
#define INF (1e9)
#define N_MAX 100
using namespace std;
const double EPS=1E-8;
typedef vector<double> vec;
typedef vector<vec> mat;

struct edge{
  int to,cap,rev;
  double cost;
};

int V;
vector<edge> G[N_MAX];
double dist[N_MAX];
int prevv[N_MAX],preve[N_MAX];

void add_edge(int from,int to,int cap,double cost){
  G[from].push_back((edge){to,cap,G[to].size(),cost});
  G[to].push_back((edge){from,0,G[from].size()-1,-cost});
}

double min_cost_flow(int s,int t,int f){
  double res=0;
  while(f>0){
    fill(dist,dist+V,INF);
    dist[s]=0;
    bool update=true;
    while(update){
      update=false;
      for(int v=0;v<V;v++){
	if(dist[v]==INF)continue;
	for(int i=0;i<G[v].size();i++){
	  edge &e=G[v][i];
	  if(e.cap>0&&dist[e.to]>dist[v]+e.cost){
	    dist[e.to]=dist[v]+e.cost;
	    prevv[e.to]=v;
	    preve[e.to]=i;
	    update=true;
	  }
	}
      }
    }
    if(dist[t]==INF)return -1;
    int d=f;
    for(int v=t;v!=s;v=prevv[v])
      d=min(d,G[prevv[v]][preve[v]].cap);
    f-=d;
    res+=d*dist[t];
    for(int v=t;v!=s;v=prevv[v]){
      edge &e=G[prevv[v]][preve[v]];
      e.cap-=d;
      G[v][e.rev].cap+=d;
    }
  }
  return res;
}

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(abs(B[j][i])>abs(B[pivot][i]))pivot=j;
    swap(B[i],B[pivot]);
    if(abs(B[i][i])<EPS)return vec();
    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;
}

int main(){
  int T,N,s,t,F,M,d[N_MAX],f[N_MAX];
  cin>>T;
  while(T--){
    cin>>N>>s>>t>>F;
    V=N;
    vec b(N);
    mat A(N,vec(N,0));
    for(int i=0;i<N;i++){
      for(int j=0;j<N;j++)cin>>A[i][j];
      cin>>b[i];
    }
    vec r=gauss_jordan(A,b);
    for(int i=0;i<N;i++){
      cin>>M;
      for(int j=0;j<M;j++)cin>>d[j];
      for(int j=0;j<M;j++)cin>>f[j];
      for(int j=0;j<M;j++)
	add_edge(i,d[j],f[j],abs(r[i]-r[d[j]]));
    }
    double ans=min_cost_flow(s,t,F);
    if(ans!=-1)printf("%.8f\n",ans);
    else cout<<"impossible"<<endl;
    for(int i=0;i<N_MAX;i++)G[i].clear();
  }
  return 0;
}