public class Delivery {
private static int[][] matrix;
private static boolean[] visit;
private static boolean[] result;
public int solution(int N, int[][] road, int K) {
matrix = new int[N + 1][N + 1];
visit = new boolean[N + 1];
result = new boolean[N + 1];
int cnt = 0;
for (int[] r : road) {
matrix[r[0]][r[1]] = matrix[r[0]][r[1]] == 0 ? r[2] : Math.min(matrix[r[0]][r[1]], r[2]);
matrix[r[1]][r[0]] = matrix[r[1]][r[0]] == 0 ? r[2] : Math.min(matrix[r[1]][r[0]], r[2]);
}
dfs(1, K, 0);
for (boolean flag : result) {
if (flag) cnt++;
}
return cnt;
}
private static void dfs(int s, int k, int w) {
result[s] = visit[s] = true;
for (int i = 1; i < matrix.length; i++) {
if (matrix[s][i] != 0 && !visit[i] && w + matrix[s][i] <= k) {
dfs(i, k, w + matrix[s][i]);
}
}
visit[s] = false;
}
}