#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int X, Y, W, Number;
  double V;
};
bool operator<(Edge A, Edge B) { return A.V < B.V; }
int Get() {
  char c;
  while (c = getchar(), c < '0' || c > '9')
    ;
  int X = c - 48;
  while (c = getchar(), c >= '0' && c <= '9') X = X * 10 + c - 48;
  return X;
}
const double inf = 1e6;
int P[5000], Ans[5000];
Edge E[100000];
int Root(int X) { return (P[X] == X) ? X : (P[X] = Root(P[X])); }
int MST(int N, int M, double Delta) {
  for (int i = 0; i < M; i++)
    E[i].V = (E[i].X && E[i].Y) ? E[i].W : (E[i].W + Delta);
  random_shuffle(E, E + M);
  sort(E, E + M);
  for (int i = 0; i < N; i++) P[i] = i;
  int Total = N, Count = 0, K = 0;
  for (int i = 0; Total > 1 && i < M; i++) {
    int A = Root(E[i].X), B = Root(E[i].Y);
    if (A == B) continue;
    Ans[K++] = E[i].Number;
    P[A] = B;
    Total--;
    if (!E[i].X || !E[i].Y) Count++;
  }
  return (Total > 1) ? -1 : Count;
}
int main() {
  int N = Get(), M = Get(), K = Get();
  for (int i = 0; i < M; i++) {
    E[i].X = Get() - 1;
    E[i].Y = Get() - 1;
    E[i].W = Get();
    E[i].Number = i + 1;
  }
  double Left = -inf, Right = inf;
  if (MST(N, M, Left) < K || MST(N, M, Right) > K) {
    printf("-1\n");
    return 0;
  }
  while (true) {
    double Mid = (Left + Right) / 2;
    int Temp = MST(N, M, Mid);
    if (Temp == K) break;
    for (int i = 0; i < 100000000; i++) i++;
    if (Temp > K)
      Left = Mid;
    else
      Right = Mid;
  }
  printf("%d\n", N - 1);
  for (int i = 0; i < N - 1; i++) {
    printf("%d", Ans[i]);
    putchar((i == N - 2) ? '\n' : ' ');
  }
  return 0;
}
