#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
int v,w;
};
struct str{
int a,x;
}c[500005];
vector <node> w[500005];
int n,m,s,b,u,v,t,w1,ans=1e18,vis[500005],dis[500005];
bool cmp(str n,str m){
return n.x<m.a;
}
void SPFA(int x){
memset(dis,0x3f,sizeof(dis));
queue <int> q;
vis[x]=1;
q.push(x);
dis[x]=0;
while(!q.empty())
{
int n1=q.front();
q.pop();
vis[n1]=0;
for(int i=0; i<w[n1].size(); i++)
if(dis[n1]+w[n1][i].w<dis[w[n1][i].v])
{
dis[w[n1][i].v]=dis[n1]+w[n1][i].w;
if(vis[w[n1][i].v]==0)
{
vis[w[n1][i].v]=1;
q.push(w[n1][i].v);
}
}
}
}
signed main(){
cin>>n>>m>>s>>b;
for(int i=1; i<=m; i++)
{
cin>>u>>v>>w1;
w[u].push_back(node{v,w1});
w[v].push_back(node{u,w1});
}
cin>>t;
for(int i=1; i<=t; i++)
cin>>c[i].a>>c[i].x;
sort(c+1,c+t+1,cmp);
SPFA(s);
if(t==0 || dis[b]<c[1].a)
{
cout<<dis[b];
return 0;
}
for(int i=1; i<=t; i++)
{
if(dis[c[i].x]<c[i].a)
{
cout<<c[i].a;
return 0;
}
if(dis[c[i].x]>=c[i].a && dis[c[i].x]<c[i+1].a)
{
cout<<dis[c[i].x];
return 0;
}
}
cout<<dis[c[t].x];
return 0;
}