#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
vector<pair<int, int>> g[N], ans[N];
long long dist[N];
priority_queue<pair<int, int>> pq;
bool vis[N];
void dijkstra(int s) {
  fill(dist, dist + N, 1LL << 61);
  memset(vis, false, sizeof(vis));
  dist[s] = 0;
  pq.push({0, s});
  while (!pq.empty()) {
    int u = pq.top().second;
    pq.pop();
    if (vis[u]) continue;
    vis[u] = true;
    for (int i = 0; i < g[u].size(); i++) {
      int v = g[u][i].first, w = g[u][i].second;
      if (dist[v] > dist[u] + w) {
        dist[v] = dist[u] + w;
        pq.push({-dist[v], v});
      }
    }
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  int x, y;
  cin >> x >> y;
  for (int i = 0; i < m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }
  for (int i = 1; i <= n; i++) {
    long long ti, ci;
    cin >> ti >> ci;
    dijkstra(i);
    for (int j = 1; j <= n; j++) {
      if (dist[j] <= ti) {
        ans[i].push_back({j, ci});
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    g[i] = ans[i];
  }
  dijkstra(x);
  if (dist[y] == 1LL << 61)
    cout << -1;
  else
    cout << dist[y];
  return 0;
}
