#define _USE_MATH_DEFINES
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <nmmintrin.h>
#include <immintrin.h>
#include <mmintrin.h>

using namespace std;

#define dprint(Exp,...) if(Exp){fprintf(stderr, __VA_ARGS__);}
#define printe(...) fprintf(stderr, __VA_ARGS__);
#define PrtExp(_Exp)  cerr<< #_Exp <<" = "<< (_Exp)
#define PrtExpN(_Exp)  cerr<< #_Exp <<" = "<< (_Exp) <<"\n"

#define SINT(n) scanf("%d",&n)
#define SINT2(n,m) scanf("%d %d",&n,&m)
#define SINT3(n,m,o) scanf("%d %d %d",&n,&m,&o)
#define SINT4(n,m,o,P) scanf("%d %d %d %d",&n,&m,&o,&P)
#define SINT5(n,m,o,P,q) scanf("%d %d %d %d %d",&n,&m,&o,&P,&q)
#define SLL(n) scanf("%lld",&n)
#define SLL2(n,m) scanf("%lld %lld",&n,&m)
#define SLL3(n,m,o) scanf("%lld %lld %lld",&n,&m,&o)
#define SST(s) scanf("%s",s)
#define SCH(c) scanf("%c",&c)

#define GC() getchar()

#define PINT(n) printf("%d",(int)(n))
#define PINT2(n,m) printf("%d %d",(int)(n),(int)(m))
#define PINT3(n,m,l) printf("%d %d %d",(int)(n),(int)(m),(int)(l))
#define PLL(n) printf("%lld",(long long)(n))
#define PST(s) printf("%s",(s))
#define PCH(s) printf("%c",(s))

#define PINTN(n) printf("%d\n",(int)(n))
#define PINT2N(n,m) printf("%d %d\n",(int)(n),(int)(m))
#define PINT3N(n,m,l) printf("%d %d %d\n",(int)(n),(int)(m),(int)(l))
#define PLLN(n) printf("%lld\n",(long long)(n))
#define PSTN(s) printf("%s\n",(s))
#define PCHN(s) printf("%c\n",(s))

#define PSP() printf(" ")
#define PN() printf("\n")

#define PC(c) putchar(c)
#define CSP (' ')
#define SN ("\n")

#define rep(i,a) for(int i=0;i<a;i++)
#define reP(i,a) for(int i=0;i<=a;i++)
#define Rep(i,a) for(int i=a-1;i>=0;i--)
#define ReP(i,a) for(int i=a;i>=0;i--)

#define rEp(i,a) for(i=0;i<a;i++)
#define rEP(i,a) for(i=0;i<=a;i++)
#define REp(i,a) for(i=a-1;i>=0;i--)
#define REP(i,a) for(i=a;i>=0;i--)

#define repft(i,a,b) for(int i=a;i<b;i++)
#define repfT(i,a,b) for(int i=a;i<=b;i++)
#define Repft(i,a,b) for(int i=a-1;i>=b;i--)
#define RepfT(i,a,b) for(int i=a;i>=b;i--)

#define foreach(a,it) for(auto it = a.begin(); it != a.end(); ++it)

#define FILL(a,v) fill(begin(a),end(a), v)
#define FILL0(a) memset(a,0,sizeof(a))
#define FILL1(a) memset(a,-1,sizeof(a))

typedef long long ll;

typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll>   Pll;


const int INF = 1'010'000'000; // 0x3C33'6080
const ll INFLL = 0x1f1f1f1f1f1f1f1fLL;//2,242,545,357,980,376,863

template <class A, class B> inline ostream& operator<<(ostream& st, const pair<A, B>& P) { return st << "(" << P.first << "," << P.second << ")"; };
template <class A, class B> inline pair<A, B> operator+(const pair<A, B>& P, const pair<A, B>& Q) { return pair<A, B>(P.first + Q.first, P.second + Q.second); };
template <class A, class B> inline pair<A, B> operator-(const pair<A, B>& P, const pair<A, B>& Q) { return pair<A, B>(P.first - Q.first, P.second - Q.second); };

#define fs  first
#define sc  second



int D[24][128][128];
vector<Pi> C[24][128];

int main() {
	int n, m, c, s, g;
	while (cin >> n >> m >> c >> s >> g, n) {
		--s; --g;

		rep(i, 24)rep(j, 128)rep(k, 128) D[i][j][k] = (j == k ? 0 : INF);
		rep(i, 24) rep(j, 128) C[i][j].clear();


		rep(i, m) {
			int x, y, d, c;
			cin >> x >> y >> d >> c;
			--x; --y; --c;
			D[c][x][y] = D[c][y][x] = min(D[c][y][x], d);
		}
		rep(c, 24) {
			rep(k, n) rep(i, n) rep(j, n) {
				D[c][i][j] = min(D[c][i][j], D[c][i][k] + D[c][k][j]);
			}
		}
		vector<int> p(c);
		rep(i, c) cin >> p[i];
		rep(ci, c) {
			vector<int> q(p[ci] - 1);
			vector<int> r(p[ci]);
			rep(j, p[ci] - 1) cin >> q[j];
			rep(j, p[ci] - 0) cin >> r[j];
			vector<int> cc(20001);
			q.push_back(cc.size());
			int s = 0;
			int i = 0;
			rep(j, p[ci]) {
				for (; i < q[j]; ++i) {
					cc[i] = s;
					s += r[j];
				}
			}
			rep(i, n) rep(j, n){
				if (D[ci][i][j] < INF) {
					C[ci][i].emplace_back(j, cc[D[ci][i][j]]);
				}
			}
			/*
			printf("{%d}\n", ci);
			repft(i, 1, 35) {
				printf("%2d ", i);
			}
			puts("");
			repft(i, 1, 35) {
				printf("%2d ", cc[i]);
			}
			printf("\n----------\n");
			*/
		}
		/*
		rep(i, n) {
			rep(j, c) {
				if (C[j][i].empty()) continue;
				printf("[%d,%d]", i, j);
				for (auto&p : C[j][i]) cout << p; cout << endl;
			}
		}
		//*/

		vector<int> dist(n, INF);
		priority_queue<Pi, vector<Pi>, greater<Pi>> Q;
		Q.push({0, s});
		dist[s] = 0;
		while (!Q.empty()) {
			int cost = Q.top().first;
			int idx = Q.top().second;
			Q.pop();
			if (dist[idx] < cost) continue;
			rep(ci, c) {
				for (auto&p : C[ci][idx]) {
					int co = cost + p.second;
					if (dist[p.first] <= co) continue;
					dist[p.first] = co;
					Q.push({ co, p.first });
				}
			}
		}
		if (dist[g] == INF) {
			cout << -1 << endl;
		} else {
			cout << dist[g] << endl;
		}

	}

}





Measured memory_bytes: 6808