#include <bits/stdc++.h>
using namespace std;
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
template <typename T>
inline int chkmin(T &a, const T &b) {
  return b < a ? a = b, 1 : 0;
}
template <typename T>
inline int chkmax(T &a, const T &b) {
  return b > a ? a = b, 1 : 0;
}
template <typename T>
inline T sqr(const T &val) {
  return val * val;
}
namespace fastIO {
const int MAX_BUFFER_SIZE = 1 << 16;
char buffer[MAX_BUFFER_SIZE], *cur = buffer, *ed = buffer;
inline char getc() {
  return *(cur == ed ? ed = buffer + fread(buffer, 1, MAX_BUFFER_SIZE, stdin),
           cur = buffer : cur)++;
}
}  // namespace fastIO
using fastIO::getc;
template <typename T>
inline T read() {
  register T sum(0), fg(1);
  register char ch(getc());
  for (; !isdigit(ch); ch = getc())
    if (ch == '-') fg = -1;
  for (; isdigit(ch); ch = getc()) sum = sum * 10 - '0' + ch;
  return sum * fg;
}
const int MAXN = (int)1e5;
int K, n, m;
int a[MAXN + 5];
int type[MAXN + 5];
int cov[MAXN + 5], id[MAXN + 5];
vector<pair<long double, int> > add[MAXN + 5], mul;
inline void input() {
  K = read<int>(), n = read<int>(), m = read<int>();
  for (int i = 1; i <= K; ++i) a[i] = read<int>();
  for (int i = 1; i <= n; ++i) {
    int t = read<int>(), p = read<int>(), val = read<int>();
    type[i] = t;
    if (t == 1 && chkmax(cov[p], val - a[p])) id[p] = i;
    if (t == 2) add[p].emplace_back(val, i);
    if (t == 3) mul.emplace_back((long double)val, i);
  }
}
inline void solve() {
  for (int i = 1; i <= K; ++i) {
    if (id[i]) add[i].emplace_back(cov[i], id[i]);
    sort((add[i]).begin(), (add[i]).end(), greater<pair<int, int> >());
    long long res = a[i];
    for (int j = 0; j < ((int)(add[i]).size()); ++j) {
      mul.emplace_back((long double)(res + add[i][j].first) / res,
                       add[i][j].second);
      res += add[i][j].first;
    }
  }
  sort((mul).begin(), (mul).end(),
       [](pair<long double, int> A, pair<long double, int> B) {
         return A.first > B.first;
       });
  int M = min(((int)(mul).size()), m);
  printf("%d\n", M);
  for (int i = 0; i < M; ++i)
    if (type[mul[i].second] == 1) printf("%d ", mul[i].second);
  for (int i = 0; i < M; ++i)
    if (type[mul[i].second] == 2) printf("%d ", mul[i].second);
  for (int i = 0; i < M; ++i)
    if (type[mul[i].second] == 3) printf("%d ", mul[i].second);
  puts("");
}
int main() {
  input();
  solve();
  return 0;
}
