#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
void read(int &x) {
  char ch = getchar();
  x = 0;
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
}
const int N = 1e5 + 10;
int k, n, m, a[N], mx[N], id[N], b[N], ok[N];
pair<int, int> mul[N];
int cnt;
vector<pair<int, int> > add[N];
double num[N];
int res[N], w[N];
long long now[N];
struct qwq {
  double val;
  int id, bl;
  bool operator<(const qwq &x) const { return val < x.val; }
};
priority_queue<qwq> q;
double f(long long now, int ad) { return 1.0 * (now + ad) / now; }
signed main() {
  read(k), read(n), read(m);
  for (int i = 1; i <= k; ++i) read(a[i]), now[i] = a[i];
  mul[0] = make_pair(1, 0);
  for (int i = 1, t, j; i <= n; ++i) {
    read(t), read(j), read(b[i]);
    if (t == 1) {
      if (mx[j] < b[i]) ok[i] = 1, mx[j] = b[i], id[j] = i;
    } else if (t == 2)
      add[j].push_back(make_pair(b[i], i));
    else if (t == 3)
      mul[++cnt] = make_pair(b[i], i);
  }
  for (int i = 1; i <= k; ++i)
    if (mx[i] > a[i]) add[i].push_back(make_pair(mx[i] - a[i], id[i]));
  for (int i = 1; i <= k; ++i)
    sort(add[i].begin(), add[i].end()), w[i] = add[i].size() - 1;
  for (int i = 1; i <= k; ++i) {
    if (w[i] >= 0)
      q.push((qwq){f(now[i], add[i][w[i]].first), add[i][w[i]].second, i});
  }
  num[0] = 1;
  int mxnum = 0, mm = -1, nn = 0;
  double la;
  for (int i = 1; i <= m; ++i) {
    if (q.empty()) {
      mm = i - 1;
      break;
    }
    qwq tmp = q.top();
    q.pop();
    int bl = tmp.bl;
    num[i] = num[i - 1] * tmp.val, res[i] = tmp.id, --w[bl],
    now[bl] += b[tmp.id];
    if (w[bl] >= 0)
      q.push(
          (qwq){f(now[bl], add[bl][w[bl]].first), add[bl][w[bl]].second, bl});
  }
  if (mm < 0) mm = m;
  nn = mm;
  la = num[nn];
  sort(mul + 1, mul + cnt + 1);
  for (int i = 1; i <= cnt; ++i) {
    int id = min(mm, m - i);
    if (num[id] * mul[cnt - i + 1].first < la)
      break;
    else
      la = num[id], nn = id, mxnum = i;
  }
  printf("%d\n", nn + mxnum);
  for (int i = 1; i <= nn; ++i)
    if (ok[res[i]]) printf("%d ", res[i]);
  for (int i = 1; i <= nn; ++i)
    if (!ok[res[i]]) printf("%d ", res[i]);
  for (int i = 1; i <= mxnum; ++i) printf("%d ", mul[cnt - i + 1].second);
  return 0;
}
