import java.util.*;
import java.io.*;
public class Main
{
public static class Conn{
int dep, time;
Conn next;
Conn(int dep, int time, Conn next){
this.dep = dep;
this.time = time;
this.next = next;
}
}
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
while(T-->0){
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
Conn[] conn = new Conn[n+1];
for(int i=0; i<d; i++){
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
conn[b] = new Conn(a,s, conn[b]);
}
boolean visited[] = new boolean[n+1];
int[] times = new int[n+1];
Arrays.fill(times, Integer.MAX_VALUE);
times[c] = 0;
int curr = c;
int result1 = 0;
int result2 = 0;
while(true){
int min = Integer.MAX_VALUE;
for(int i=1; i<=n; i++){
if(visited[i]) continue;
if(min > times[i]){
curr = i;
min = times[i];
}
}
if(min == Integer.MAX_VALUE) break;
result1++;
result2 += min;
visited[curr] = true;
for(int i=1; i<=n; i++){
if(times[i] != Integer.MAX_VALUE)
times[i] -= min;
}
for(Conn temp = conn[curr]; temp!=null; temp = temp.next){
times[temp.dep] = Math.min(times[temp.dep], temp.time);
}
}
System.out.println(result1+" "+result2);
}
}
}
현재 연결되어있는 노드중에서 가장 빨리 해킹할수 있는것부터 해킹하면 풀린다.
이 문제는 주의해야하는게 감염시키는 순간에도 시간은 지나가기에
현재 컴퓨터가 해킹되면 그 지나간 시간도 계산해주어야지 된다...