#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5000 + 100, MAXE = 1e5 + 100;
class edge {
 public:
  int u, v;
  double w;
  inline int other(int x) { return (u == x ? v : u); }
  edge() {}
};
edge e[MAXE];
int id[MAXE], par[MAXN], ans[MAXE], ansN;
vector<int> toroot;
int n, m;
int findpar(int u) { return (u == par[u] ? u : par[u] = findpar(par[u])); }
void join(int u, int v) {
  u = findpar(u), v = findpar(v);
  par[u] = v;
}
bool byE(int x, int y) { return e[x].w < e[y].w; }
int mst(double add) {
  ansN = 0;
  int outp = 0;
  for (int i = 0; i < toroot.size(); i++) e[toroot[i]].w += add;
  for (int i = 0; i < m; i++) id[i] = i;
  sort(id, id + m, byE);
  for (int i = 0; i < n; i++) par[i] = i;
  for (int i = 0; i < m; i++) {
    int u = e[id[i]].u, v = e[id[i]].v;
    if (findpar(u) == findpar(v)) continue;
    join(u, v);
    if (u == 0 || v == 0) outp++;
    ans[ansN++] = id[i] + 1;
  }
  for (int i = 0; i < toroot.size(); i++) e[toroot[i]].w -= add;
  return outp;
}
int main() {
  ios::sync_with_stdio(false);
  int k;
  cin >> n >> m >> k;
  for (int i = 0; i < m; i++) {
    int x, y, w;
    cin >> x >> y >> w;
    x--;
    y--;
    e[i].w = w;
    e[i].u = x;
    e[i].v = y;
    if (x == 0 || y == 0) toroot.push_back(i);
  }
  bool flag = 0;
  double l = -1e6, r = 1e6;
  for (int i = 0; i < 300; i++) {
    double mid = (l + r) / 2;
    int temp = mst(mid);
    if (temp == k) {
      l = mid;
      flag = 1;
      break;
    }
    if (temp > k)
      l = mid;
    else
      r = mid;
  }
  mst(l);
  if (!flag) ansN = -1;
  cout << ansN << "\n";
  for (int i = 0; i < ansN; i++) cout << ans[i] << " ";
}
