#include <bits/stdc++.h>
using namespace std;
struct Upgrade {
  int id, i, val;
  Upgrade(int _id = 0, int _i = 0, int _val = 0) : id(_id), i(_i), val(_val) {}
  friend bool operator<(const Upgrade &a, const Upgrade &b) {
    return a.val < b.val;
  }
};
struct Data {
  Upgrade upgrade;
  long long nume, deno;
  int id;
  Data(int _id = 0, long long _nume = 0, long long _deno = 0,
       Upgrade _upgrade = Upgrade())
      : id(_id), nume(_nume), deno(_deno), upgrade(_upgrade) {}
  friend bool operator<(const Data &a, const Data &b) {
    return double(a.nume) / a.deno < double(b.nume) / b.deno;
  }
};
int n, m, k;
long long a[100010];
bool is_assg[100010];
Upgrade assg[100010];
vector<Upgrade> mult;
vector<Upgrade> add;
vector<Upgrade> add_list[100010];
priority_queue<Data> q;
double sum_mult[100010], sum;
bool cmp(const Upgrade &a, const Upgrade &b) { return b < a; }
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m >> k;
  for (int i = 1; i <= n; i++) cin >> a[i];
  memset(assg, -1, sizeof assg);
  for (int i = 1; i <= m; i++) {
    Upgrade upgrade(i);
    int type;
    cin >> type >> upgrade.i >> upgrade.val;
    if (type == 1) {
      is_assg[i] = 1;
      if (assg[upgrade.i] < upgrade) assg[upgrade.i] = upgrade;
    } else if (type == 2)
      add_list[upgrade.i].push_back(upgrade);
    else
      mult.push_back(upgrade);
  }
  for (int i = 1; i <= n; i++) {
    if (assg[i].id != -1) {
      assg[i].val -= a[i];
      add_list[i].push_back(assg[i]);
    }
    sort(add_list[i].begin(), add_list[i].end());
    if (!add_list[i].empty()) {
      q.push(Data(i, a[i] + add_list[i].back().val, a[i], add_list[i].back()));
      add_list[i].pop_back();
    }
  }
  while (!q.empty()) {
    Data data = q.top();
    q.pop();
    add.push_back(data.upgrade);
    int i = data.id;
    if (!add_list[i].empty()) {
      q.push(Data(i, data.nume + add_list[i].back().val,
                  data.deno + data.upgrade.val, add_list[i].back()));
      add_list[i].pop_back();
    }
  }
  sort(mult.begin(), mult.end(), cmp);
  sum_mult[0] = 0;
  for (int i = 1; i <= mult.size(); i++)
    sum_mult[i] = sum_mult[i - 1] + log(mult[i - 1].val);
  sum = 0;
  for (int i = 1; i <= n; i++) sum += log(a[i]);
  double max_sum = sum + sum_mult[min((int)mult.size(), k)];
  int optimal = 0;
  for (int i = 0; i < add.size() && i < k; i++) {
    sum -= log(a[add[i].i]);
    a[add[i].i] += add[i].val;
    sum += log(a[add[i].i]);
    double total = sum + sum_mult[min((int)mult.size(), k - i - 1)];
    if (total > max_sum) {
      max_sum = total;
      optimal = i + 1;
    }
  }
  vector<int> trace;
  for (int i = 0; i < optimal; i++)
    if (is_assg[add[i].id]) trace.push_back(add[i].id);
  for (int i = 0; i < optimal; i++)
    if (!is_assg[add[i].id]) trace.push_back(add[i].id);
  for (int i = 0; i < min((int)mult.size(), k - optimal); i++)
    trace.push_back(mult[i].id);
  cout << trace.size() << "\n";
  for (int i = 0; i < trace.size(); i++) cout << trace[i] << " ";
  return 0;
}
