#include <bits/stdc++.h>
using namespace std;
const int MAXV = 200000 + 10;
struct node {
  int l, r, left, right;
  int siz;
  long long va;
} nds[MAXV << 1];
int ndcnt = -1;
inline int new_node(int l, int r) {
  int p = ++ndcnt;
  nds[p].l = l, nds[p].r = r;
  nds[p].va = nds[p].siz = nds[p].left = nds[p].right = 0;
  return p;
}
inline void update(int x) {
  nds[x].va = nds[nds[x].left].va + nds[nds[x].right].va;
  nds[x].siz = nds[nds[x].left].siz + nds[nds[x].right].siz;
}
inline int build(int l, int r) {
  int now = new_node(l, r);
  if (l == r) return now;
  int mid = (l + r) >> 1;
  nds[now].left = build(l, mid);
  nds[now].right = build(mid + 1, r);
  return now;
}
inline void seginsert(int now, int pos, int va) {
  if (nds[now].l == nds[now].r) {
    nds[now].va = va;
    nds[now].siz = 1;
    return;
  }
  int mid = (nds[now].l + nds[now].r) >> 1;
  if (pos <= mid)
    seginsert(nds[now].left, pos, va);
  else
    seginsert(nds[now].right, pos, va);
  update(now);
}
inline void segclear(int now) {
  if (nds[now].l == nds[now].r) {
    nds[now].va = nds[now].siz = 0;
    return;
  }
  if (nds[nds[now].left].siz) segclear(nds[now].left);
  if (nds[nds[now].right].siz) segclear(nds[now].right);
  update(now);
}
inline int segid(int now, int sz) {
  if (nds[now].l == nds[now].r) return nds[now].l;
  if (sz <= nds[nds[now].left].siz)
    return segid(nds[now].left, sz);
  else
    return segid(nds[now].right, sz - nds[nds[now].left].siz);
}
inline long long segval(int now, int l, int r) {
  if (nds[now].l == l && nds[now].r == r) return nds[now].va;
  int mid = (nds[now].l + nds[now].r) >> 1;
  if (r <= mid)
    return segval(nds[now].left, l, r);
  else if (l > mid)
    return segval(nds[now].right, l, r);
  else
    return segval(nds[now].left, l, mid) + segval(nds[now].right, mid + 1, r);
}
int qx[300];
int qx_cnt = 0;
int sgrt1;
inline void segfnd(int now, int l, int r) {
  if (nds[now].l == l && nds[now].r == r) {
    qx[++qx_cnt] = now;
    return;
  }
  int mid = (nds[now].l + nds[now].r) >> 1;
  if (r <= mid)
    segfnd(nds[now].left, l, r);
  else if (l > mid)
    segfnd(nds[now].right, l, r);
  else
    segfnd(nds[now].l, l, mid), segfnd(nds[now].right, mid + 1, r);
}
inline int dfs(int now, long long t) {
  if (nds[now].va <= t) return nds[now].siz;
  if (nds[now].l == nds[now].r) return 0;
  if (t > nds[nds[now].left].va)
    return nds[nds[now].left].siz +
           dfs(nds[now].right, t - nds[nds[now].left].va);
  else
    return dfs(nds[now].left, t);
}
inline int segget(int l, int r, long long t) {
  qx_cnt = 0;
  segfnd(sgrt1, l, r);
  int as = 0;
  for (int i = 1; i <= qx_cnt; ++i) {
    int now = qx[i];
    if (nds[now].va <= t) {
      as += nds[now].siz;
      t -= nds[now].va;
    } else {
      as += dfs(now, t);
      break;
    }
  }
  return as;
}
inline int getcnt(int sizl, int sizr, long long t) {
  if (sizl > sizr) return 0;
  int l = segid(sgrt1, sizl), r = segid(sgrt1, sizr);
  return segget(l, r, t);
}
inline long long getval(int sizl, int sizr) {
  if (sizl > sizr) return 0;
  int l = segid(sgrt1, sizl), r = segid(sgrt1, sizr);
  return segval(sgrt1, l, r);
}
inline void ini() { sgrt1 = build(1, 200000); }
struct dat {
  int id, va;
  bool operator<(const dat& x) const { return va < x.va; }
} dts[MAXV];
int c, n, m;
long long t;
int main() {
  ini();
  scanf("%d", &c);
  while (c--) {
    segclear(sgrt1);
    scanf("%d %d %lld", &n, &m, &t);
    for (int i = 1; i <= n; ++i) {
      scanf("%d", &dts[i].va);
      dts[i].id = i;
    }
    sort(dts + 1, dts + 1 + n);
    dts[n + 1].va = -1;
    int as = 0;
    int asid = 1;
    for (int i = 1; i <= n; ++i) {
      seginsert(sgrt1, dts[i].id, dts[i].va);
      if (dts[i].va == dts[i + 1].va) continue;
      int tas = 0, cct = 0;
      long long res = t;
      int nowl = ((i / m) * m + 1), nowr = i;
      if (nowl > 1) {
        cct = getcnt(1, nowl - 1, res >> 1);
        if (cct == nowl - 1) {
          res -= getval(1, cct) << 1;
          tas = cct + getcnt(nowl, nowr, res);
        } else {
          int pl = (cct / m) * m + 1;
          res -= getval(1, pl - 1) << 1;
          tas += pl - 1 + getcnt(pl, min(pl + m - 1, nowl - 1), res);
        }
      } else
        tas = getcnt(nowl, nowr, res);
      if (tas > as) {
        as = tas;
        asid = dts[i].va;
      }
    }
    printf("%d %d\n", as, asid);
  }
  return 0;
}
