#include <bits/stdc++.h>
using namespace std;
inline int read() {
  char ch = getchar();
  int res = 0, flag = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') flag = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    res = res * 10 + ch - '0';
    ch = getchar();
  }
  return res * flag;
}
int k, n, m, op, x, y, tot;
long long a[100001];
pair<pair<int, int>, int> as[100001];
priority_queue<pair<pair<int, int>, int> > add[100001];
struct mul {
  long double val;
  int pos;
  int type;
} sk[200001];
inline bool cmp(mul sk1, mul sk2) { return sk1.val > sk2.val; }
int main() {
  k = read();
  n = read();
  m = read();
  for (register int i = 1; i <= k; ++i) a[i] = read();
  for (register int i = 1; i <= n; ++i) {
    op = read();
    x = read();
    y = read();
    if (op == 1) {
      if (y - a[x] > as[x].first.first)
        as[x] = make_pair(make_pair(y - a[x], i), 1);
    } else if (op == 2)
      add[x].push(make_pair(make_pair(y, i), 2));
    else
      sk[++tot] = (mul){(long double)y, i, 3};
  }
  for (register int i = 1; i <= k; ++i)
    if (as[i].first.first) add[i].push(as[i]);
  for (register int i = 1; i <= k; ++i)
    while (!add[i].empty()) {
      long long t1 = a[i], t2 = a[i] + add[i].top().first.first;
      sk[++tot] = (mul){(long double)t2 / t1, add[i].top().first.second,
                        add[i].top().second};
      a[i] += add[i].top().first.first;
      add[i].pop();
    }
  sort(sk + 1, sk + tot + 1, cmp);
  int up = min(m, tot);
  printf("%d\n", up);
  for (register int i = 1; i <= up; ++i)
    if (sk[i].type == 1) printf("%d ", sk[i].pos);
  for (register int i = 1; i <= up; ++i)
    if (sk[i].type == 2) printf("%d ", sk[i].pos);
  for (register int i = 1; i <= up; ++i)
    if (sk[i].type == 3) printf("%d ", sk[i].pos);
  return 0;
}
