#include <bits/stdc++.h>
using namespace std;
struct ed {
  int t, n;
  long long w;
} e[2010];
int n, m, k, l, h[1010], c, a, b;
long long d[1010][1010], dmh[1010], t[1010], co[1010], w;
bool v[1010];
queue<int> que;
void aspeFA(int x) {
  for (int i = 1; i <= n; i++) {
    d[x][i] = 1e15;
    v[i] = 0;
  }
  d[x][x] = 0;
  v[x] = 1;
  que.push(x);
  while (!que.empty()) {
    c = que.front();
    v[c] = 0;
    que.pop();
    for (int i = h[c]; i != 0; i = e[i].n) {
      if (d[x][e[i].t] > d[x][c] + e[i].w) {
        d[x][e[i].t] = d[x][c] + e[i].w;
        if (!v[e[i].t]) {
          que.push(e[i].t);
          v[e[i].t] = 1;
        }
      }
    }
  }
}
int main() {
  scanf("%d%d%d%d", &n, &m, &a, &b);
  for (int i = 0; i < m; i++) {
    scanf("%d%d%I64d", &k, &l, &w);
    e[i * 2 + 1].t = l;
    e[i * 2 + 1].n = h[k];
    e[i * 2 + 1].w = w;
    h[k] = i * 2 + 1;
    e[i * 2 + 2].t = k;
    e[i * 2 + 2].n = h[l];
    e[i * 2 + 2].w = w;
    h[l] = i * 2 + 2;
  }
  for (int i = 1; i <= n; i++) scanf("%I64d%I64d", &t[i], &co[i]);
  for (int i = 1; i <= n; i++) aspeFA(i);
  for (int i = 1; i <= n; i++) {
    v[i] = 0;
    dmh[i] = 1e15;
  }
  dmh[a] = 0;
  v[a] = 1;
  que.push(a);
  while (!que.empty()) {
    c = que.front();
    v[c] = 0;
    que.pop();
    for (int i = 1; i <= n; i++) {
      if (d[i][c] > t[c]) continue;
      if (dmh[i] > dmh[c] + co[c]) {
        dmh[i] = dmh[c] + co[c];
        if (!v[i]) {
          que.push(i);
          v[i] = 1;
        }
      }
    }
  }
  if (dmh[b] == 1e15)
    printf("-1\n");
  else
    printf("%I64d\n", dmh[b]);
  return 0;
}
