There are N cities numbered 1 to N, connected by M railroads.

You are now at City 1, with 10^{100} gold coins and S silver coins in your pocket.

The i-th railroad connects City U_i and City V_i bidirectionally, and a one-way trip costs A_i silver coins and takes B_i minutes. You cannot use gold coins to pay the fare.

There is an exchange counter in each city. At the exchange counter in City i, you can get C_i silver coins for 1 gold coin. The transaction takes D_i minutes for each gold coin you give. You can exchange any number of gold coins at each exchange counter.

For each t=2, ..., N, find the minimum time needed to travel from City 1 to City t. You can ignore the time spent waiting for trains.

Constraints

* 2 \leq N \leq 50
* N-1 \leq M \leq 100
* 0 \leq S \leq 10^9
* 1 \leq A_i \leq 50
* 1 \leq B_i,C_i,D_i \leq 10^9
* 1 \leq U_i < V_i \leq N
* There is no pair i, j(i \neq j) such that (U_i,V_i)=(U_j,V_j).
* Each city t=2,...,N can be reached from City 1 with some number of railroads.
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N M S
U_1 V_1 A_1 B_1
:
U_M V_M A_M B_M
C_1 D_1
:
C_N D_N


Output

For each t=2, ..., N in this order, print a line containing the minimum time needed to travel from City 1 to City t.

Examples

Input

3 2 1
1 2 1 2
1 3 2 4
1 11
1 2
2 5


Output

2
14


Input

4 4 1
1 2 1 5
1 3 4 4
2 4 2 2
3 4 1 1
3 1
3 1
5 2
6 4


Output

5
5
7


Input

6 5 1
1 2 1 1
1 3 2 1
2 4 5 1
3 5 11 1
1 6 50 1
1 10000
1 3000
1 700
1 100
1 1
100 1


Output

1
9003
14606
16510
16576


Input

4 6 1000000000
1 2 50 1
1 3 50 5
1 4 50 7
2 3 50 2
2 4 50 4
3 4 50 3
10 2
4 4
5 5
7 7


Output

1
3
5


Input

2 1 0
1 2 1 1
1 1000000000
1 1


Output

1000000001
import java.util.*;

public class Main {
    static List<Map<Integer, Cost>> mp = new ArrayList<>();
    static long[] exch, exchTime;
    static long[] minTime;
    static int N;
    static long S;
    static long amax=0;
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        int M = sc.nextInt();
        S = sc.nextLong();
        exch = new long[N];
        exchTime = new long[N];
        minTime = new long[N];
        for(int i=0;i<N;i++){
            mp.add(new HashMap<>());
        }
        for(int i=0;i<M;i++){
            int U=sc.nextInt()-1;
            int V=sc.nextInt()-1;
            long A=sc.nextLong();
            amax = Math.max(amax, A);
            long B=sc.nextLong();
            mp.get(U).put(V, new Cost(A, B));
            mp.get(V).put(U, new Cost(A, B));
        }
        for(int i=0;i<N;i++) {
            exch[i] = sc.nextLong();
            exchTime[i] = sc.nextLong();
        }

        PriorityQueue<State> pq = new PriorityQueue<>(new Comparator<State>() {
            @Override
            public int compare(State o1, State o2) {
                if(o1.time > o2.time){
                    return 1;
                }else{
                    return -1;
                }
            }
        });

        long[] rich = new long[N];
        Arrays.fill(minTime, Long.MAX_VALUE);
        Set<Integer> visited = new HashSet<>();
        Set<Integer> filled = new HashSet<>();
        pq.add(new State(S, 0, 0));
        while(!pq.isEmpty() && filled.size() != N){
            State now = pq.poll();
            int nowpos = now.now;
            long nows = now.silver;
            long nowtime = now.time;
            int key = nowpos * 3000 + (int)nows;
            if(visited.contains(key)){
                continue;
            }
            if(nows + exch[nowpos] <= 2500) {
                pq.add(new State(nows + exch[nowpos], nowtime + exchTime[nowpos], nowpos));
            }
            filled.add(nowpos);
            visited.add(key);
            rich[nowpos] = nows;
            minTime[nowpos] = Math.min(minTime[nowpos], nowtime);
            Map<Integer, Cost> neighbors = mp.get(nowpos);
            for(Integer nei:neighbors.keySet()){
                long money = neighbors.get(nei).money;
                long time = neighbors.get(nei).time;
                if(nows >= money) {
                    pq.add(new State(nows - money,
                            nowtime + time,
                            nei));
                }
            }
        }
        for(int i=1;i<N;i++){
            System.out.println(minTime[i]);
        }
    }

    private static class State{
        long silver;
        long time;
        int now;
        State(long s, long t, int n){
            silver = s;
            time = t;
            now = n;
        }
        @Override
        public String toString(){
            return now + " sil:" + silver + " time:" + time;
        }
    }

    private static class Cost{
        long money;
        long time;
        Cost(long a, long b){
            money = a;
            time = b;
        }
        @Override
        public String toString(){
            return "sil:" + money + " time:" + time;
        }
    }
}
