#include <bits/stdc++.h>
using namespace std;
struct edge {
  int u, v, r;
} G[100010];
int n, m, f[5010], k, c[5010 * 20], r[5010 * 20], A[5010], t;
double C[5010 * 20];
inline bool c1(int i, int j) { return C[G[i].r] < C[G[j].r]; }
inline int gf(int x) {
  for (; x ^ f[x]; x = f[x] = f[f[x]])
    ;
  return x;
}
inline int work(double t) {
  for (int i = 1; i <= m; ++i)
    C[r[i] = i] = c[i] + t * (G[i].u == 1 || G[i].v == 1);
  for (int i = 1; i <= n; ++i) f[i] = i;
  sort(r + 1, r + 1 + m, c1);
  int z = n, c = 0;
  for (int x, y, i = 1; i <= m; ++i) {
    x = gf(G[r[i]].u);
    y = gf(G[r[i]].v);
    if (x ^ y) {
      f[x] = y;
      --z;
      if (G[r[i]].u == 1) ++c;
    }
  }
  if (z > 1) return n;
  return c;
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d%d", &G[i].u, &G[i].v, c + i);
    G[i].r = i;
    if (G[i].u > G[i].v) swap(G[i].u, G[i].v);
  }
  if (work(1e8) > k) return 0 & puts("-1");
  double l = -1e5;
  for (double M, r = 1e5 + 0.314; r - l > 1e-2;) {
    M = (l + r) / 2.;
    if (work(M) < k)
      r = M;
    else
      l = M;
  }
  for (int i = 1; i <= m; ++i)
    C[r[i] = i] = c[i] + l * (G[i].u == 1 || G[i].v == 1);
  for (int i = 1; i <= n; ++i) f[i] = i;
  sort(r + 1, r + 1 + m, c1);
  int z = n, c = 0;
  for (int x, y, i = 1; i <= m; ++i) {
    x = gf(G[r[i]].u);
    y = gf(G[r[i]].v);
    if (x ^ y && (k || G[r[i]].u != 1)) {
      f[x] = y;
      --z;
      A[++t] = r[i];
      k -= (G[r[i]].u == 1);
    }
  }
  printf("%d\n", n - 1);
  for (int i = 1; i <= t; ++i) printf("%d ", A[i]);
}
