#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-15;
struct edge {
  int u, v, id, use;
  double w;
};
bool cmp(edge a, edge b) { return a.w < b.w; }
edge e[100005];
int f[5005];
int findset(int k) {
  if (k == f[k]) return k;
  f[k] = findset(f[k]);
  return f[k];
}
void unionset(int a, int b) {
  int ak = findset(a);
  int bk = findset(b);
  f[ak] = bk;
}
int n, m, k;
edge te[100005];
int kruskal(double mid) {
  for (int i = 0; i < m; i++) {
    te[i] = e[i];
    if (te[i].u == 1) te[i].w += mid;
  }
  sort(te, te + m, cmp);
  for (int i = 1; i <= n; i++) f[i] = i;
  int sum = 1, ret = 0;
  for (int i = 0; i < m && sum < n; i++) {
    if (!te[i].use && findset(te[i].u) != findset(te[i].v)) {
      te[i].use = 1;
      unionset(te[i].u, te[i].v);
      sum++;
      if (te[i].u == 1) ret++;
    }
  }
  if (sum < n) return -1;
  return ret;
}
int main() {
  while (scanf("%d %d %d", &n, &m, &k) == 3) {
    for (int i = 0; i < m; i++) {
      scanf("%d %d %lf", &e[i].u, &e[i].v, &e[i].w);
      if (e[i].u > e[i].v) swap(e[i].u, e[i].v);
      e[i].id = i + 1;
      e[i].use = 0;
    }
    double low = -1e6, high = 1e6, mid;
    int tmp;
    while (low + eps < high) {
      mid = (low + high) / 2.0;
      tmp = kruskal(mid);
      if (tmp < k)
        high = mid;
      else if (tmp > k)
        low = mid;
      else
        break;
    }
    if (tmp != k)
      puts("-1");
    else {
      printf("%d\n", n - 1);
      for (int i = 0; i < m; i++)
        if (te[i].use) printf("%d ", te[i].id);
      puts("");
    }
  }
  return 0;
}
