#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define pb push_back
#define rep(a, b, c, d) for(int a=b; a<=c; a+=d)
const int N = 1e5 + 5;
int n, m, s, ed, cnt;
int head[N], dis[N];
bitset<N> vis;
struct node {
int to;
int nex;
int val;
} e[N];
void add(int u, int v, int w) {
++ cnt;
e[cnt].to = v;
e[cnt].val = w;
e[cnt].nex = head[u];
head[u] = cnt;
}
struct node2 {
int d;
int x;
bool operator<(const node2 &a) const {
return d > a.d;
}
};
void dijkstra(int a) {
rep(i, 1, n, 1)
dis[i] = LLONG_MAX;
dis[a] = 0;
queue<node2> q;
q.push({0, a});
while(!q.empty()) {
int x = q.front().x;
q.pop();
if(vis[x])
continue;
vis[x] = 1;
for(int i = head[x]; i; i = e[i].nex) {
int v = e[i].to, w = e[i].val;
if(dis[v] > dis[x] + w) {
dis[v] = dis[x] + w;
q.push({dis[v], v});
}
}
}
}
struct node3 {
int k, x;
bool operator<(const node3 &a) const {
return k < a.k;
}
} mv[N];
signed main () {
cin >> n >> m >> s >> ed;
rep(i, 1, m, 1) {
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
int x;
cin >> x;
rep(i, 1, x, 1)
cin >> mv[i].k >> mv[i].x;
sort(mv + 1, mv + x + 1);
dijkstra(s);
if(dis[ed] < mv[1].k || x == 0)
return cout << dis[ed], 0;
rep(i, 1, x, 1) {
if(dis[mv[i].x] <= mv[i].k)
return cout << mv[i].k, 0;
if(dis[mv[i].x] < mv[i + 1].k)
return cout << dis[mv[i].x], 0;
}
return 0;
}