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 {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int s = sc.nextInt();
        int ms = (n-1) * 50;
        s = Math.min(s, ms);
        int[] a = new int[m];
        int[] u = new int[m];
        int[] v = new int[m];
        int[] b = new int[m];
        int[] c = new int[n];
        int[] d = new int[n];
        ArrayList<Integer>[] nexts = new ArrayList[n];
        for(int i=0; i<n; i++) {
            nexts[i] = new ArrayList<Integer>();
        }
        for(int i=0; i<m; i++) {
            u[i] = sc.nextInt()-1;
            v[i] = sc.nextInt()-1;
            nexts[u[i]].add(i);
            nexts[v[i]].add(i);
            a[i] = sc.nextInt();
            b[i] = sc.nextInt();
        }
        for(int i=0; i<n; i++) {
            c[i] = sc.nextInt();
            d[i] = sc.nextInt();
        }
        Set<Long> visited = new HashSet<Long>();
        State init = new State(0, s, 0);
        PriorityQueue<State> q = new PriorityQueue<>();
        long[] res = new long[n];
        int rem = n-1;
        q.add(init);
        while(!q.isEmpty()) {
            State st = q.poll();
            if(visited.contains(st.ps())) continue;
            if(st.p != 0 && res[st.p] == 0) {
                res[st.p] = st.d;
                rem--;
                if(rem == 0) break;
            }
            visited.add(st.ps());
            int ns = st.s + c[st.p];
            ns = Math.min(ns, ms);
            long nd = st.d + d[st.p];
            State nextState = new State(st.p, ns, nd);
            if(!visited.contains(nextState.ps())) {
                q.add(nextState);
            }
            for(int i=0; i<nexts[st.p].size(); i++) {
                int j = nexts[st.p].get(i);
                int np = u[j];
                if(u[j] == st.p) np = v[j];
                if(st.s < a[j]) continue;
                nextState = new State(np, st.s-a[j], st.d+b[j]);
                if(!visited.contains(nextState.ps())) {
                    q.add(nextState);
                }
            }
        }

        for(int i=1; i<n; i++) {
            System.out.println(res[i]);
        }



    }

    static class State implements Comparable<State>{
        int p;
        int s;
        long d;
        public State(int p, int s, long d) {
            this.p = p;
            this.s = s;
            this.d = d;
        }
        public int compareTo(State st) {
            return Long.compare(d, st.d);
        }
        long ps() {
            return ((long)p << 32) + s;
        }
    }

}