#include <stdio.h>

#define INF 1000000000

int n,m,c,s,g;
int map[100][100];
int temp_map[100][100];

typedef struct {
	int x,y,d,c;
} rosen_t;

rosen_t rosen[10000];

int p[20];
int q[20][50];
int r[20][50];

int calc_untin(int c,int dist) {
	int untin=0;
	int nowdist=0;
	int nowkukan=0;
	while(1) {
		if(nowkukan>=p[c]-1 || dist<=q[c][nowkukan]) {
			return untin+(dist-nowdist)*r[c][nowkukan];
		} else {
			untin+=(q[c][nowkukan]-nowdist)*r[c][nowkukan];
			nowdist=q[c][nowkukan];
			nowkukan++;
		}
	}
}

int main(void) {
	while(scanf("%d%d%d%d%d",&n,&m,&c,&s,&g)==5 && (n|m|c|s|g)!=0) {
		int i,j,k,rs;
		s--;g--;
		for(i=0;i<m;i++) {
			scanf("%d%d%d%d",
				&rosen[i].x,&rosen[i].y,&rosen[i].d,&rosen[i].c);
			rosen[i].x--;rosen[i].y--;rosen[i].c--;
		}
		for(i=0;i<c;i++)scanf("%d",&p[i]);
		for(i=0;i<c;i++) {
			for(j=0;j<p[i]-1;j++)scanf("%d",&q[i][j]);
			for(j=0;j<p[i];j++)scanf("%d",&r[i][j]);
		}
		for(i=0;i<n;i++) {
			for(j=0;j<n;j++)map[i][j]=(i==j?0:INF);
		}
		for(rs=0;rs<c;rs++) {
			for(i=0;i<n;i++) {
				for(j=0;j<n;j++)temp_map[i][j]=(i==j?0:INF);
			}
			for(i=0;i<m;i++) {
				if(rosen[i].c==rs && temp_map[rosen[i].x][rosen[i].y]>rosen[i].d) {
					temp_map[rosen[i].x][rosen[i].y]=rosen[i].d;
					temp_map[rosen[i].y][rosen[i].x]=rosen[i].d;
				}
			}
			for(k=0;k<n;k++) {
				for(i=0;i<n;i++) {
					for(j=0;j<n;j++) {
						if(temp_map[i][j]>temp_map[i][k]+temp_map[k][j]) {
							temp_map[i][j]=temp_map[i][k]+temp_map[k][j];
						}
					}
				}
			}
			for(i=0;i<n;i++) {
				for(j=0;j<n;j++) {
					if(temp_map[i][j]<INF) {
						int now_untin=calc_untin(rs,temp_map[i][j]);
						if(map[i][j]>now_untin)map[i][j]=now_untin;
					}
				}
			}
		}
		for(k=0;k<n;k++) {
			for(i=0;i<n;i++) {
				for(j=0;j<n;j++) {
					if(map[i][j]>map[i][k]+map[k][j]) {
						map[i][j]=map[i][k]+map[k][j];
					}
				}
			}
		}
		printf("%d\n",map[s][g]<INF?map[s][g]:-1);
	}
	return 0;
}