#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const double eps = 1e-9;
const double pi = 4 * atan(1.0);
const int N = int(1e5) + 100;
struct tp {
  int num, add;
  long long a;
};
bool operator==(const tp& a, const tp& b) {
  return a.add * b.a == b.add * a.a && a.num == b.num;
}
bool operator<(const tp& a, const tp& b) {
  if (a.add * b.a != b.add * a.a) {
    return a.add * b.a > b.add * a.a;
  }
  return a.num < b.num;
}
bool is_set[N];
long long a[N];
pair<long long, int> mul[N];
long double sum_mul[N];
pair<int, int> max_b[N];
vector<pair<int, int> > add[N];
vector<int> lst, best_lst;
set<tp> s;
int main() {
  int k, n, m;
  cin >> k >> n >> m;
  for (int i = 0; i < k; ++i) {
    scanf("%lld", a + i);
  }
  int sz = 0;
  for (int i = 0; i < n; ++i) {
    int t, num, b;
    scanf("%d %d %d", &t, &num, &b);
    --num;
    if (t == 1) {
      is_set[i] = true;
      max_b[num] = max(max_b[num], make_pair(b, i));
    }
    if (t == 2) {
      add[num].push_back(make_pair(b, i));
    }
    if (t == 3) {
      mul[sz++] = make_pair(b, i);
    }
  }
  sort(mul, mul + sz);
  reverse(mul, mul + sz);
  for (int i = 1; i <= sz; ++i) {
    sum_mul[i] = sum_mul[i - 1] + logl(mul[i - 1].first);
  }
  for (int i = 0; i < k; ++i) {
    if (max_b[i].first > a[i]) {
      add[i].push_back(
          make_pair((int)(max_b[i].first - a[i]), max_b[i].second));
    }
    sort((add[i]).begin(), (add[i]).end());
    if (((int)(add[i]).size()) > 0) {
      s.insert({i, add[i].back().first, a[i]});
    }
  }
  long double cur = 0;
  pair<long double, int> ans(-1e100, -1);
  for (int i = 0; i < k; ++i) {
    cur += logl(a[i]);
  }
  for (int i = 0; i <= m; ++i) {
    if (i > 0 && ((int)(s).size()) > 0) {
      tp best = *(s.begin());
      s.erase(s.begin());
      cur -= logl(best.a);
      cur += logl(best.a + best.add);
      a[best.num] += best.add;
      lst.push_back(add[best.num].back().second);
      add[best.num].pop_back();
      if (((int)(add[best.num]).size()) > 0) {
        s.insert({best.num, add[best.num].back().first, a[best.num]});
      }
    }
    int can = min(m - i, sz);
    ans = max(ans, make_pair(cur + sum_mul[can], i));
  }
  int can = min(m - ans.second, sz);
  for (int i = 0; i < min(ans.second, ((int)(lst).size())); ++i) {
    if (is_set[lst[i]]) {
      best_lst.push_back(lst[i]);
    }
  }
  for (int i = 0; i < min(ans.second, ((int)(lst).size())); ++i) {
    if (!is_set[lst[i]]) {
      best_lst.push_back(lst[i]);
    }
  }
  for (int i = 0; i < can; ++i) {
    best_lst.push_back(mul[i].second);
  }
  cout << ((int)(best_lst).size()) << endl;
  for (int i = 0; i < ((int)(best_lst).size()); ++i) {
    printf("%d ", best_lst[i] + 1);
  }
  puts("");
  return 0;
}
