#include <bits/stdc++.h>
using namespace std;
const int MAX_N = (100000 + 100);
int N, M, S, L, ans, dist[MAX_N];
int vis[MAX_N], flag[MAX_N];
struct Node {
  int v, w;
  Node() {}
  Node(int _v, int _w) : v(_v), w(_w) {}
};
vector<Node> g[MAX_N];
struct Edge {
  int u, v, w;
} edge[MAX_N << 1];
void spfa(int st) {
  memset(dist, 0x3f, sizeof(dist));
  memset(vis, 0, sizeof(vis));
  dist[st] = 0;
  queue<int> que;
  que.push(st);
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    vis[u] = 0;
    for (int i = (0); i < ((int)g[u].size()); ++i) {
      int v = g[u][i].v, w = g[u][i].w;
      if (dist[u] + w < dist[v]) {
        dist[v] = dist[u] + w;
        if (!vis[v]) {
          vis[v] = 1;
          que.push(v);
        }
      }
    }
  }
}
int main() {
  while (cin >> N >> M >> S) {
    for (int i = (1); i <= (N); ++i) g[i].clear();
    for (int i = (1); i <= (M); ++i) {
      int u, v, w;
      cin >> u >> v >> w;
      g[u].push_back(Node(v, w));
      g[v].push_back(Node(u, w));
      edge[i].u = u, edge[i].v = v, edge[i].w = w;
    }
    cin >> L;
    spfa(S);
    memset(flag, 0, sizeof(flag));
    ans = 0;
    for (int i = (1); i <= (N); ++i)
      if (dist[i] == L) ++ans;
    for (int i = (1); i <= (M); ++i) {
      int d1 = dist[edge[i].u], d2 = dist[edge[i].v], w = edge[i].w;
      if (d1 + w == d2 || d2 + w == d1) {
        if ((d1 < L && d2 > L) || (d2 < L && d1 > L)) ++ans;
      } else {
        if (d1 < L && d1 + w > L) {
          int dd = d1 + w - L;
          if (d2 + dd >= L) ++ans;
        }
        if (d2 < L && d2 + w > L) {
          int dd = d2 + w - L;
          if (d1 + dd >= L) ++ans;
        }
        if (2 * L == d1 + d2 + w) --ans;
      }
    }
    cout << ans << endl;
  }
  return 0;
}
