#include <bits/stdc++.h>
using namespace std;
int par[5010];
int sub[5010];
int l[100010], r[100010], c[100010];
int n, m;
bool take[100010];
struct edge {
  int l, r, idx;
  double weight;
  edge(int l, int r, double weight, int idx)
      : l(l), r(r), weight(weight), idx(idx) {}
  edge() {}
  bool operator<(edge e) const { return weight < e.weight; }
};
int root(int x) {
  if (x == par[x]) return x;
  return par[x] = root(par[x]);
}
void join(int x, int y) {
  x = root(x);
  y = root(y);
  if (sub[x] > sub[y]) swap(x, y);
  if (x != y) {
    par[x] = y;
    sub[y] += sub[x];
  }
}
int solve(double x) {
  for (int i = 1; i <= n; i++) {
    par[i] = i;
    sub[i] = 1;
  }
  vector<edge> v;
  for (int i = 1; i <= m; i++) {
    take[i] = false;
    if (l[i] == 1 || r[i] == 1) {
      v.push_back(edge(l[i], r[i], x + c[i], i));
    } else {
      v.push_back(edge(l[i], r[i], c[i], i));
    }
  }
  sort(v.begin(), v.end());
  int cnt = 0;
  for (int i = 0; i < m; i++) {
    int p = v[i].l;
    int q = v[i].r;
    if (root(p) != root(q)) {
      join(p, q);
      if (p == 1 || q == 1) ++cnt;
      take[v[i].idx] = true;
    }
  }
  return cnt;
}
int main(int argc, char const *argv[]) {
  int k;
  scanf("%d %d %d", &n, &m, &k);
  for (int i = 1; i <= m; i++) {
    scanf("%d %d %d", l + i, r + i, c + i);
  }
  double l = -1e6;
  double r = 1e6;
  bool found = false;
  for (int i = 0; i < 80; i++) {
    double m = (l + r) / 2;
    int f = solve(m);
    if (f > k) {
      l = m;
    } else if (f < k) {
      r = m;
    } else {
      found = true;
      break;
    }
  }
  if (found) {
    printf("%d\n", n - 1);
    for (int i = 1; i <= m; i++) {
      if (take[i]) printf("%d ", i);
    }
    printf("\n");
  } else {
    printf("-1\n");
  }
  return 0;
}
