#include<stdio.h>
#include<stdlib.h>
#define MAX 101
#define c_MAX 21
#define k_MAX 59
typedef struct train *link;
struct train{//駅間を結ぶ路線の情報を備えた構造体
  int v;
  int comp;
  int dist;
  link next;
};
int n,m,c,s,g;
int p[c_MAX],q[c_MAX][k_MAX],r[c_MAX][k_MAX+1];
int cost,min,visited[MAX];
link station[MAX];//各駅からのびる路線を各リンクに収納
link NEW(int v,link next,int dist,int comp){//リストの追加
  link x=malloc(sizeof(*x));
  x->v=v;x->next=next;x->comp=comp;x->dist=dist;
}
int price(int,int);

void solve(int,int,int);

int main(void){
  int i,j,x,y,dist,comp;
  while(1){
    scanf("%d %d %d %d %d",&n,&m,&c,&s,&g);
    if(n==0&&m==0&&c==0&&s==0&&g==0)break;
    for(i=1;i<MAX;i++){
      visited[i]=0;station[i]=NULL;
    }
    for(i=0;i<m;i++){
      scanf("%d %d %d %d",&x,&y,&dist,&comp);
      station[x]=NEW(y,station[x],dist,comp);//路線図をリストによるグラフで実現
      station[y]=NEW(x,station[y],dist,comp);
    }
    for(i=1;i<=c;i++)scanf("%d",&p[i]);
    for(i=1;i<=c;i++){
      for(j=1;j<p[i];j++)scanf("%d",&q[i][j]);
      for(j=1;j<=p[i];j++)scanf("%d",&r[i][j]);
    }
    cost=0;min=-1;
    solve(s,0,0);
    printf("%d\n",min);
  }
  return 0;
}

int price(int company,int distance){//料金計算の関数
  int i=1,j,sum=0,total=0;
  while(sum<distance){
    total+=r[company][i];
    sum++;
    if(q[company][i]==sum)i++;
  }
  return total;
}

void solve(int now,int past,int total){//経路探索の関数
  link t;
  int ride,sum;
  if(now==g){
    ride=price(past,total);
    cost+=ride;
    if(min==-1 ||min>cost)min=cost;
    cost-=ride;
    return;
  }
  visited[now]=1;
  for(t=station[now];t!=NULL;t=t->next){//今いる駅からつながっている線路を調べる
    if(visited[t->v]==0){//まだ訪れてなければ続行
      ride=0;
      if(past==t->comp ||past==0){//同じ鉄道会社に乗り換えた場合
	sum=total+t->dist;
      }
      else{//違う鉄道会社に乗り換えた場合
	ride=price(past,total);
	sum=t->dist;
      }
      cost+=ride;
      if(min!=-1 && cost>min){//現時点におけるminを上回ればそこで終了
	cost-=ride;
	continue;
      }
      solve(t->v,t->comp,sum);
      cost-=ride;
    }
  }
  visited[now]=0;
}