#include<bits/stdc++.h>
#define N 1600000
#define int long long
using namespace std;
struct node{
int to,ne,w;
}edge[1060061];
int head[N],dis[N],vis[N];
struct nodd{
int ti;
int p;
bool operator <(const nodd&A) const{
return ti<A.ti;
}
}cxz[N];
inline void read(int &x){
x=0; int y=1; char c=getchar();
while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
x*=y;
}
int n,m,b,e,cnt,T,ans=0x7fffffff;
inline void add(int s,int t,int v){
edge[++cnt].ne=head[s];
edge[cnt].to=t;
edge[cnt].w=v;
head[s]=cnt;
}
queue<int> q;
void spfa(int s){
fill(dis+1,dis+1+n,0x7fffffff);
q.push(s);
vis[s]=1;
dis[s]=0;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u]; i; i=edge[i].ne){
int v=edge[i].to;
if(dis[v]>dis[u]+abs(edge[i].w)){
dis[v]=dis[u]+edge[i].w;
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
}
}
signed main(){
read(n);read(m);read(b);read(e);
for(int i=1; i<=m; i++){
int _,__,___;
read(_);read(__);read(___);
add(_,__,___);
add(__,_,___);
}
read(T);
for(int i=1; i<=T; i++) read(cxz[i].ti),read(cxz[i].p);
spfa(b);
sort(cxz+1,cxz+1+T);
if(T==0) return printf("%lld",dis[e]),0;
if(dis[e]<cxz[1].ti) return printf("%lld",dis[e]),0;
for(int i=1; i<=T; i++){
if(dis[cxz[i].p]<=cxz[i].ti){
return printf("%lld",dis[cxz[i].p]),0;
}
}
return 0;
}