#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool checkMax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T, typename... Args>
inline void checkMax(T &a, const Args... arg) {
  checkMax(a, max(arg...));
}
template <class T>
inline bool checkMin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T, typename... Args>
inline void checkMin(T &a, const Args... arg) {
  checkMin(a, min(arg...));
}
const int INF = 0x3f3f3f3f;
const long long llINF = 1e18;
const int MAXN = 1e5 + 5;
int k, n, m;
int a[MAXN], t[MAXN];
pair<int, int> assign[MAXN];
vector<pair<int, int> > add[MAXN];
vector<pair<double, int> > mul;
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1, x, b; i <= m; i++) {
    scanf("%d%d%d", t + i, &x, &b);
    if (t[i] == 1) checkMax(assign[x], make_pair(b, i));
    if (t[i] == 2) add[x].emplace_back(b, i);
    if (t[i] == 3) mul.emplace_back(b, i);
  }
  for (int i = 1; i <= n; i++)
    if (assign[i].first > a[i])
      add[i].emplace_back(assign[i].first - a[i], assign[i].second);
  for (int i = 1; i <= n; i++) {
    sort(add[i].begin(), add[i].end());
    reverse(add[i].begin(), add[i].end());
    long long v = a[i];
    for (auto p : add[i]) {
      mul.emplace_back(1.0 * (v + p.first) / v, p.second);
      v += p.first;
    }
  }
  sort(mul.begin(), mul.end());
  reverse(mul.begin(), mul.end());
  int num = min(k, (int)mul.size());
  sort(mul.begin(), mul.begin() + num,
       [&](const pair<double, int> &x, const pair<double, int> &y) {
         return t[x.second] < t[y.second];
       });
  printf("%d\n", num);
  for (int i = 0; i < num; i++) printf("%d ", mul[i].second);
  return 0;
}
