#include <bits/stdc++.h>
using namespace std;
const int maxn = 5100, maxm = 110000;
int n, m, K;
struct T_E {
  int a, b, w;
  double v;
} E[maxm];
struct Tfind {
  int f[maxn];
  void set(int n) {
    int i;
    for (i = 0; i <= n + 1; ++i) f[i] = i;
  }
  int find(int x) { return x != f[x] ? f[x] = find(f[x]) : x; }
  inline void add(int a, int b) { f[find(a)] = find(b); }
};
namespace Ninit {
void init() {
  int i;
  scanf("%d%d%d", &n, &m, &K);
  for (i = 0; i < m; ++i) {
    scanf("%d%d%lf", &E[i].a, &E[i].b, &E[i].v), E[i].w = i + 1;
    if (E[i].a > E[i].b) swap(E[i].a, E[i].b);
  }
}
}  // namespace Ninit
namespace Nsolve {
T_E *O[maxn];
namespace Nkru {
Tfind fnd;
inline bool cmp(const T_E &a, const T_E &b) {
  return a.v != b.v ? a.v < b.v : a.w < b.w;
}
bool kruscal() {
  int i;
  T_E *p;
  sort(E, E + m, cmp), fnd.set(n);
  for (p = E, i = 1; i < n && p < E + m; ++i) {
    for (; p < E + m && fnd.find(p->a) == fnd.find(p->b); ++p)
      ;
    O[i] = p, fnd.add(p->a, p->b);
  }
  return i == n;
}
int Chk(double Lmt) {
  T_E *p;
  int i, Fc = 0;
  for (p = E; p < E + m; ++p)
    if (p->a == 1) p->v += Lmt;
  if (!kruscal()) return -1;
  for (p = E; p < E + m; ++p)
    if (p->a == 1) p->v -= Lmt;
  for (i = 1; i < n; ++i)
    if (O[i]->a == 1) ++Fc;
  return Fc >= K ? Fc : 0;
}
}  // namespace Nkru
using Nkru::Chk;
void solve() {
  int i, res;
  double l, r, mid;
  if (Chk(0) == -1) return printf("-1\n"), void();
  for (l = -1e9, r = 1e9, i = 0; i < 100; ++i) {
    mid = (l + r) / 2, res = Chk(mid);
    if (res == K) break;
    res ? l = mid : r = mid;
  }
  if (res != K) return printf("-1\n"), void();
  printf("%d\n", n - 1);
  for (i = 1; i < n; ++i) printf("%d ", O[i]->w);
  printf("\n");
}
}  // namespace Nsolve
int main() {
  Ninit::init();
  Nsolve::solve();
  return 0;
}
