#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  long long n, m, k, s;
  cin >> n >> m >> k >> s;
  vector<vector<long long>> a(2, vector<long long>(n));
  for (long long i = 0; i < 2; ++i) {
    for (long long j = 0; j < n; ++j) {
      cin >> a[i][j];
    }
  }
  vector<vector<pair<long long, long long>>> g(2);
  for (long long i = 0; i < m; ++i) {
    long long x, y;
    cin >> x >> y;
    g[x - 1].push_back({y, i});
  }
  for (long long i = 0; i < 2; ++i) {
    sort(g[i].begin(), g[i].end());
  }
  auto ok = [&](long long q) {
    vector<long long> p(2, numeric_limits<long long>::max());
    vector<long long> day(2, -1);
    for (long long i = 0; i <= q; ++i) {
      for (long long j = 0; j < 2; ++j) {
        if (p[j] > a[j][i]) {
          p[j] = a[j][i];
          day[j] = i;
        }
      }
    }
    assert(day[0] != -1 && day[1] != -1);
    long long i = 0, j = 0;
    vector<pair<long long, long long>> ans;
    long long ss = s;
    auto buyi = [&]() {
      ss -= p[0] * g[0][i].first;
      ans.push_back({g[0][i].second, day[0]});
      ++i;
    };
    auto buyj = [&]() {
      ss -= p[1] * g[1][j].first;
      ans.push_back({g[1][j].second, day[1]});
      ++j;
    };
    while ((i < g[0].size() || j < g[1].size()) && ans.size() < k) {
      if (i >= g[0].size()) {
        buyj();
      } else if (j >= g[1].size()) {
        buyi();
      } else {
        if (p[0] * g[0][i].first < p[1] * g[1][j].first)
          buyi();
        else
          buyj();
      }
    }
    if (ss < 0 || ans.size() < k) ans.clear();
    return ans;
  };
  if (ok(n - 1).size() == 0) {
    cout << "-1\n";
    return 0;
  }
  long long l = 0, r = n - 1;
  while (r - l > 1) {
    long long mid = (l + r) >> 1;
    if (ok(mid).size()) {
      r = mid;
    } else {
      l = mid + 1;
    }
  }
  if (!ok(l).size()) {
    l = r;
  }
  cout << l + 1 << '\n';
  for (auto [x, y] : ok(l)) {
    cout << x + 1 << ' ' << y + 1 << '\n';
  }
}
