#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define pb push_back
const int N = 1e5 + 5;
int n, m, s, ed, T;
int head[N], dis[N];
bool vis[N];
struct node {
int to;
int nex;
int val;
} e[N * 2];
int cnt = 0;
void add(int u, int v, int w) {
e[++cnt] = {v, head[u], w};
head[u] = cnt;
e[++cnt] = {u, head[v], w};
head[v] = cnt;
}
struct node2 {
int d;
int x;
bool operator < (const node2 &a) const {
return d > a.d;
}
};
void dijkstra(int a) {
fill(dis + 1, dis + n + 1, LLONG_MAX);
dis[a] = 0;
priority_queue<node2> q;
q.push({0, a});
while (!q.empty()) {
int x = q.top().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 time;
int pos;
bool operator < (const node3 &a) const {
return time < a.time;
}
} mv[N];
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> s >> ed;
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
}
cin >> T;
for (int i = 1; i <= T; i++) {
cin >> mv[i].time >> mv[i].pos;
}
sort(mv + 1, mv + T + 1);
dijkstra(s);
int ans = LLONG_MAX;
for (int i = 1; i <= T; i++) {
int t = mv[i].time;
int pos = mv[i].pos;
if (dis[pos] <= t) {
ans = min(ans, t);
} else if (i < T && dis[pos] < mv[i + 1].time) {
ans = min(ans, dis[pos]);
}
}
if (ans == LLONG_MAX) {
ans = dis[ed];
}
cout << ans;
return 0;
}