#include <bits/stdc++.h>
using namespace std;
struct abcde {
  int id, ope;
  long long fz, fm;
} op[100005];
struct opra {
  long long val;
  int ope, id;
  friend bool operator<(opra x, opra y) { return x.val > y.val; }
};
int n, k, m, cnt;
long long a[100005], cdefg[100005][2];
bool cmp1(abcde, abcde);
bool cmp2(abcde, abcde);
long long gcd(long long, long long);
vector<opra> c[100005];
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= n; ++i) scanf("%lld", a + i);
  for (int i = 1; i <= m; ++i) {
    int ope, x, val;
    scanf("%d%d%d", &ope, &x, &val);
    if (ope == 1 && cdefg[x][0] < val) cdefg[x][0] = val, cdefg[x][1] = i;
    if (ope == 2) c[x].push_back((opra){val, 2, i});
    if (ope == 3) op[++cnt] = (abcde){i, ope, val - 1, 1};
  }
  for (int i = 1; i <= n; ++i) {
    if (cdefg[i][0] && cdefg[i][0] > a[i])
      c[i].push_back((opra){cdefg[i][0] - a[i], 1, (int)cdefg[i][1]});
    sort(c[i].begin(), c[i].end());
    int sz = c[i].size();
    for (int j = 0; j < sz; ++j) {
      long long tmp = gcd(c[i][j].val + a[i], a[i]);
      op[++cnt] = (abcde){c[i][j].id, c[i][j].ope,
                          (c[i][j].val + a[i]) / tmp - a[i] / tmp, a[i] / tmp};
      a[i] += c[i][j].val;
    }
  }
  sort(op + 1, op + 1 + cnt, cmp1);
  sort(op + 1, op + 1 + min(cnt, k), cmp2);
  cout << min(cnt, k) << endl;
  for (int i = 1; i <= min(cnt, k); ++i) printf("%d ", op[i].id);
  return 0;
}
bool cmp1(abcde x, abcde y) { return x.fz * y.fm > x.fm * y.fz; }
bool cmp2(abcde x, abcde y) { return x.ope < y.ope; }
long long gcd(long long x, long long y) {
  if (!y) return x;
  return gcd(y, x % y);
}
