#include<iostream>
#define JUNCTIONS 301
#define INF 999999
typedef struct _state{
char color;
int remains;
int tb;
int tp;
bool marked;
} state;
state js[JUNCTIONS];
int roads[JUNCTIONS][JUNCTIONS];
int n,m;
int s,t;
int d[JUNCTIONS];
using namespace std;
state curstate(int k,int laps){
state rs;
int t = 0;
rs = js[k];
if(!laps) return rs;
if(laps < rs.remains) {
rs.remains -= laps;
}else{
t = laps - rs.remains;
t = t % (rs.tb+rs.tp);
if(rs.color == 'P'){
if(t>=0 && t< rs.tb)
rs.color = 'B';
else
rs.color = 'P';
}else{
if(t>=0 && t< rs.tp)
rs.color = 'P';
else
rs.color = 'B';
}
if(rs.color == 'P') rs.remains = rs.tp - t;
else rs.remains = rs.tb - t;
}
return rs;
}
int wait(state &a,state &b){
if(a.color == b.color) return 0;
else{
if(a.remains != b.remains) return a.remains > b.remains? b.remains:a.remains;
else{
if(a.color == 'B'){
if(a.tp != b.tb) return a.tp > b.tb? b.tb:a.tp;
else{
if(a.tb != b.tp) return a.tb > b.tp? b.tp:a.tb;
else{
return INF;
}
}
}else{
if(a.tb != b.tp) return a.tb > b.tp? b.tp:a.tb;
else{
if(a.tp != b.tb) return a.tp > b.tb? b.tb:a.tp;
else{
return INF;
}
}
}
}
}
return -1;
}
void main(){
int i,j,k,l,tmp,lasp,w;
state ss,se;
cin>>s>>t;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
roads[i][j] = INF;
for(i=1;i<=n;i++)
d[i] = INF;
for(i=1;i<=n;i++){
state tmp;
cin>>tmp.color>>tmp.remains>>tmp.tb>>tmp.tp;
tmp.marked = false;
js[i] = tmp;
}
for(i=1;i<=m;i++){
cin>>j>>k;
cin >> roads[j][k];
}
d[s] = 0;
js[s].marked = true;
k=s;//标志每一步的源点
//laps = 0;
for(;;){
if(k == t) break;
ss = curstate(k,d[k]);//得到源点的状态
l = INF;
for(i=1;i<=n;i++){
if(!js[i].marked){
se = curstate(i,d[k]);//得到i点的状态
w = wait(ss,se);//计算等待时间
if(d[i] > d[k] + roads[k][i] + w){
d[i] = d[k] + roads[k][i] + w;
}
if(l > d[i]){
l = d[i];
tmp = i;
}
}
}
k = tmp;
js[k].marked = true;
}
printf("%d",d[t]);
}