#include <bits/stdc++.h>
using namespace std;
int n, m, o, re = 0;
long long res = 0;
long long a[1000010];
int b[1000010][3];
pair<int, int> ass[1000010];
bool chk[1000010];
vector<pair<int, int> > ans;
priority_queue<pair<double, int> > Q;
priority_queue<pair<int, int> > lis[1000010];
int main() {
  memset(ass, -1, sizeof(ass));
  int i, j, k, l;
  long long ll, rr, mid;
  scanf("%d %d %d", &n, &m, &o);
  for (i = 1; i <= n; i++) {
    scanf("%I64d", &a[i]);
  }
  for (i = 1; i <= m; i++) {
    for (j = 0; j < 3; j++) {
      scanf("%d", &b[i][j]);
    }
    if (b[i][0] == 3) {
      Q.push(pair<double, int>(b[i][2], i));
    } else if (b[i][0] == 2) {
      lis[b[i][1]].push(pair<int, int>(b[i][2], i));
    } else {
      ass[b[i][1]] = max(ass[b[i][1]], pair<int, int>(b[i][2] - a[b[i][1]], i));
    }
  }
  for (i = 1; i <= n; i++) {
    if (ass[i].first > 0) lis[i].push(ass[i]);
    if (lis[i].empty()) continue;
    Q.push(pair<double, int>((lis[i].top().first + a[i]) / (double)a[i],
                             lis[i].top().second));
  }
  while (ans.size() < o && !Q.empty()) {
    pair<double, int> p = Q.top();
    Q.pop();
    if (p.first <= 1) break;
    if (b[p.second][0] == 3) {
      ans.push_back(pair<int, int>(3, p.second));
      continue;
    } else if (b[p.second][0] == 2) {
      k = b[p.second][1];
      ans.push_back(pair<int, int>(2, p.second));
      a[k] += lis[k].top().first;
      lis[k].pop();
      if (!lis[k].empty())
        Q.push(pair<double, int>((lis[k].top().first + a[k]) / (double)a[k],
                                 lis[k].top().second));
      continue;
    } else {
      k = b[p.second][1];
      pair<int, int> q = lis[k].top();
      lis[k].pop();
      if (q.first + a[k] == b[p.second][2]) {
        ans.push_back(pair<int, int>(1, p.second));
        chk[k] = 1;
        a[k] += q.first;
        if (!lis[k].empty())
          Q.push(pair<double, int>((lis[k].top().first + a[k]) / (double)a[k],
                                   lis[k].top().second));
        continue;
      }
      lis[k].push(pair<int, int>(b[p.second][2] - a[k], p.second));
      Q.push(pair<double, int>(b[p.second][2] / (double)a[k],
                               lis[k].top().second));
    }
  }
  if (ans.size() < o) {
    while (!Q.empty()) Q.pop();
    for (i = 1; i <= n; i++) {
      if (chk[i] == 1 || ass[i].first < 0) continue;
      Q.push(pair<double, int>((a[i] + ass[i].first) / (double)a[i],
                               ass[i].second));
    }
    while (ans.size() < o && !Q.empty()) {
      ans.push_back(pair<int, int>(1, Q.top().second));
      Q.pop();
    }
  }
  printf("%d\n", ans.size());
  sort(ans.begin(), ans.end());
  for (i = 0; i < ans.size(); i++) {
    printf("%d ", ans[i].second);
  }
  return 0;
}
