#include <bits/stdc++.h>
using namespace std;
long long x[131072];
int inc[131072], id[131072];
struct node {
  int tp;
  int wz;
  int u;
  int fz;
  long long fm;
  bool operator<(node b) const { return fz * b.fm < fm * b.fz; }
};
node nn[131072];
int ans[131072];
int main() {
  int k, n, m;
  scanf("%d%d%d", &k, &n, &m);
  for (int i = 1; i <= k; i++) {
    scanf("%lld", &x[i]);
  }
  int num = 0;
  for (int i = 1; i <= n; i++) {
    int tp, u, val;
    scanf("%d%d%d", &tp, &u, &val);
    if (tp == 1) {
      if (val - x[u] > inc[u]) {
        inc[u] = val - x[u];
        id[u] = i;
      }
    } else {
      nn[num].tp = tp;
      nn[num].wz = i;
      nn[num].u = u;
      nn[num].fz = val;
      nn[num].fm = 1;
      num++;
    }
  }
  for (int i = 1; i <= k; i++) {
    if (id[i]) {
      nn[num].tp = 1;
      nn[num].wz = id[i];
      nn[num].u = i;
      nn[num].fz = inc[i];
      nn[num].fm = 1;
      num++;
    }
  }
  sort(nn, nn + num);
  for (int i = num - 1; i >= 0; i--) {
    if (nn[i].tp == 3) {
      nn[i].fz--;
    } else {
      nn[i].fm = x[nn[i].u];
      x[nn[i].u] += nn[i].fz;
    }
  }
  sort(nn, nn + num);
  int l = 0;
  if (m > num) {
    m = num;
  }
  for (int i = num - m; i < num; i++) {
    if (nn[i].tp == 1) {
      ans[l] = nn[i].wz;
      l++;
    }
  }
  for (int i = num - m; i < num; i++) {
    if (nn[i].tp == 2) {
      ans[l] = nn[i].wz;
      l++;
    }
  }
  for (int i = num - m; i < num; i++) {
    if (nn[i].tp == 3) {
      ans[l] = nn[i].wz;
      l++;
    }
  }
  printf("%d\n", l);
  for (int i = 0; i < l; i++) {
    printf("%d", ans[i]);
    if (i == l - 1) {
      putchar('\n');
    } else {
      putchar(' ');
    }
  }
  return 0;
}
