#include <bits/stdc++.h>
using namespace std;
struct dir {
  int u;
  long long w;
};
struct edge {
  int u, v;
  long long w;
};
bool operator<(dir a, dir b) { return a.w > b.w; }
vector<dir> gr[100002];
edge eds[100002];
long long dis[100002];
int N, M, S;
long long L;
long long mx = 1ll << 60;
priority_queue<dir> q;
void init() {
  for (int i = 0; i <= N; i++) dis[i] = mx;
}
void djks(int start) {
  dir st;
  st.u = start;
  st.w = 0;
  dis[start] = 0;
  q.push(st);
  while (!q.empty()) {
    st = q.top();
    q.pop();
    if (dis[st.u] < st.w) continue;
    for (int i = 0; i < gr[st.u].size(); i++) {
      int nxt = gr[st.u][i].u;
      long long cst = st.w + gr[st.u][i].w;
      if (dis[nxt] <= cst) continue;
      dir tm;
      tm.u = nxt;
      tm.w = cst;
      dis[nxt] = cst;
      q.push(tm);
    }
  }
}
long long cal() {
  long long tot = 0;
  for (int i = 1; i <= M; i++) {
    long long u = eds[i].u, v = eds[i].v;
    long long cst = eds[i].w;
    int ps = 0;
    long long l = L;
    if (dis[u] < l && dis[u] + cst > l) {
      long long dif = cst - (l - dis[u]);
      if (dis[v] + dif >= l) {
        if (dis[v] + dif == l) ps = 1;
        tot++;
        if (ps == 1) continue;
      }
    }
    if (dis[v] < l && dis[v] + cst > l) {
      long long dif = cst - (l - dis[v]);
      if (dis[u] + dif >= l) tot++;
    }
  }
  for (int i = 1; i <= N; i++)
    if (dis[i] == L) tot++;
  return tot;
}
int main() {
  cin >> N >> M >> S;
  init();
  for (int i = 1; i <= M; i++) {
    edge e;
    cin >> e.u >> e.v >> e.w;
    eds[i] = e;
    dir d;
    d.u = e.v;
    d.w = e.w;
    gr[e.u].push_back(d);
    d.u = e.u;
    gr[e.v].push_back(d);
  }
  cin >> L;
  djks(S);
  cout << cal() << endl;
  return 0;
}
