#pragma target("avx")
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> P;
typedef vector<ll> V;
typedef unordered_map<ll, ll> U_MAP;
typedef priority_queue<ll> pq;
typedef priority_queue<ll, vector<ll>, greater<ll>> rpq;
constexpr ll INF = 1e9, MOD = 1e9 + 7, ohara = 1e6 + 10;
constexpr ll LINF = 1e18;

#define rep(i, n) for (ll(i) = 0; (i) < (int)(n); (i)++)
#define rrep(i, a, b) for (ll i = (a); i < (b); i++)
#define rrrep(i, a, b) for (ll i = (a); i >= (b); i--)
#define all(v) (v).begin(), (v).end()
#define Size(n) (n).size()
#define Cout(x) cout << (x) << endl
#define doublecout(a) cout << fixed << setprecision(15) << a << endl;
#define fi first
#define se second
#define m_p make_pair
#define p_b push_back
string to_string(string s) { return '"' + s + '"'; }
string to_string(const char* s) { return to_string((string)s); }
string to_string(bool b) { return (b ? "true" : "false"); }
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto& x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)

//------ Believe yourself as a genius!!!!!! ------

int dy[] = {1, 0, -1, 0};
int dx[] = {0, 1, 0, -1};
// int dy[]={-1,0,1,-1,1,-1,0,1};int dx[]={-1,-1,-1,0,0,1,1,1};
string alph("abcdefghijklmnopqrstuvwxyz");
ll n, cnt, ans, a, b, c[ohara], d[ohara], tmp, m, h, w, x, y, sum, k, q, s;
struct edge {
  ll to, costa, costb;
};
vector<edge> g[ohara];

int main(void) {
  cin.tie(0);
  cout.tie(0);
  ios::sync_with_stdio(false);

  cin >> n >> m >> s;
  rep(i, m) {
    cin >> a >> b >> x >> y;
    sum += x;
    a--;
    b--;
    g[a].p_b({b, x, y});
    g[b].p_b({a, x, y});
  }
  if (s >= sum) s = sum;
  rep(i, n) { cin >> c[i] >> d[i]; }
  priority_queue<pair<ll, P>, vector<pair<ll, P>>, greater<pair<ll, P>>> que;
  que.push({0LL, {s, 0}});
  ll dat[sum + 10][n + 10] = {};
  rep(i, sum + 1) rep(j, n + 1) dat[i][j] = LINF;
  dat[s][0] = 0;

  while (1) {
    if (que.empty()) break;
    pair<ll, P> X;
    X = que.top();
    que.pop();

    ll now = X.se.se, amo = X.se.fi, cost = X.fi;
    // cout << now << " " << amo << " " << cost << "\n";
    // if (now == t) continue;

    if (dat[amo][now] < cost) continue;

    rep(i, Size(g[now])) {
      edge e = g[now][i];
      ll to = e.to, new_co, new_amo;
      rrep(j, max(0LL, (e.costa - amo) / c[now]), 5010) {
        new_amo = amo + c[now] * j;
        new_co = cost + d[now] * j;
        // if (t == n - 1 && now == 1) debug(new_amo);
        new_amo -= e.costa;
        new_co += e.costb;
        if (new_amo < 0) continue;
        if (new_amo > sum) {
          new_amo = sum;
          if (dat[new_amo][to] <= new_co) break;
          que.push({new_co, {new_amo, to}});
          dat[new_amo][to] = new_co;
          break;
        }
        if (dat[new_amo][to] <= new_co) continue;
        que.push({new_co, {new_amo, to}});
        dat[new_amo][to] = new_co;
      }
    }
  }
  // debug(sum);
  // if (t == n - 1) Cout(dat[0][1]);
  rrep(t, 1, n) {
    ans = LINF;
    rep(i, sum + 1) { ans = min(ans, dat[i][t]); }
    Cout(ans);
  }
  return 0;
}


Measured memory_bytes: 77024