#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10,INF=0x3f3f3f3f;
int head[5*MAXN],net[5*MAXN],to[5*MAXN],e[5*MAXN],tot;
int dist[5*MAXN];
priority_queue< pair<int,int> >q;
int n,m,b,f,u,v,w,r;
int res=INF;
bool vis[5*MAXN];
struct node{
int t1,t2;
}t[5*MAXN];
inline bool cmp(node x,node y){
return x.t1<y.t1;
}
void link(int x,int y,int z){
to[++tot]=y; e[tot]=z; net[tot]=head[x]; head[x]=tot;
to[++tot]=x; e[tot]=z; net[tot]=head[y]; head[y]=tot;
}
inline void dijkstra(){
while(q.size()){
int k=q.top().second;
q.pop();
if(vis[k]) {continue;}
vis[k]=true;
for(int i=head[k];i;i=net[i]){
int l=to[i];
if(!vis[l]&&dist[k]+e[i]<dist[l]){
dist[l]=dist[k]+e[i];
q.push(make_pair(-dist[l],l));
}
}
}
}
int main(){
scanf("%d%d%d%d",&n,&m,&b,&f);
for(int i=1;i<=n;i++){dist[i]=INF;}
for(int i=1;i<=m;i++){e[i]=INF;}
dist[b]=0;
q.push(make_pair(0,b));
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
link(u,v,w);
}
scanf("%d",&r);
dijkstra();
if(r==0){printf("%d\n",dist[f]);}
for(int i=1;i<=r;i++){scanf("%d%d",&t[i].t1,&t[i].t2);}
sort(t+1,t+1+r,cmp);
for(int i=1;i<=r;i++){
if(dist[t[i].t2]<=t[i].t1) {
printf("%d\n",t[i].t1);
return 0;
}
else {
if(dist[t[i].t2]<t[i+1].t1) {
printf("%d\n",dist[t[i].t2]);
return 0;
}
}
}
return 0;
}