#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int x[100005], y[100005], c[100005], b[100005];
double cst[100005];
bool cmp(const int &u, const int &v) {
  return cst[u] == cst[v] ? b[u] > b[v] : cst[u] < cst[v];
}
int F[100005];
int Find(int x) { return !F[x] ? x : F[x] = Find(F[x]); }
vector<int> ans;
int Solve(double mid) {
  int ret = 0;
  for (int i = 1; i <= m; i++) cst[i] += b[i] * mid;
  sort(c + 1, c + 1 + m, cmp);
  memset(F, 0, sizeof F);
  ans.clear();
  for (int i = 1; i <= m; i++) {
    int u = c[i];
    if (Find(x[u]) != Find(y[u])) {
      ret += b[u];
      F[Find(x[u])] = Find(y[u]);
    }
  }
  for (int i = 1; i <= m; i++) cst[i] -= b[i] * mid;
  return ret;
}
void Solve2(double mid) {
  int ret = 0;
  for (int i = 1; i <= m; i++) cst[i] += b[i] * mid;
  sort(c + 1, c + 1 + m, cmp);
  memset(F, 0, sizeof F);
  ans.clear();
  for (int i = 1; i <= m; i++) {
    int u = c[i];
    if (Find(x[u]) != Find(y[u]) && ret + b[u] <= k) {
      ret += b[u];
      F[Find(x[u])] = Find(y[u]);
      ans.push_back(u);
    }
  }
  for (int i = 1; i <= m; i++) cst[i] -= b[i] * mid;
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  int s = 0;
  for (int i = 1; i <= m; i++)
    scanf("%d%d%lf", &x[i], &y[i], &cst[i]),
        c[i] = i, b[i] = (x[i] == 1 || y[i] == 1), s += b[i];
  if (s < k || (k == 0 && n != 1)) {
    puts("-1");
    return 0;
  }
  int L = -100000, R = 100000, mid;
  for (; L < R;) {
    mid = (L + R + 1) >> 1;
    int ret = Solve(mid);
    if (ret < k)
      R = mid - 1;
    else
      L = mid;
  }
  Solve2(L);
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%d%c", ans[i], " \n"[i == ans.size() - 1]);
}
