#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int u, v, i;
  double c;
} E[100100], e[100100];
int f[100100], i, n, m, k, mc, G[100100];
inline int gi() {
  int ret = 0;
  char ch = getchar();
  while ((ch > '9' || ch < '0') && ch != '-') ch = getchar();
  while (ch <= '9' && ch >= '0') ret = ret * 10 + ch - '0', ch = getchar();
  return ret;
}
int find(int x) { return (x == f[x] ? x : f[x] = find(f[x])); }
bool cmp(Edge a, Edge b) { return (double)a.c < (double)b.c; }
int Check(double x) {
  for (i = 1; i <= n; i++) f[i] = i;
  for (i = 1; i <= m; i++) {
    e[i] = E[i];
    if (E[i].u == 1) e[i].c += x;
  }
  sort(e + 1, e + m + 1, cmp);
  int d = 0, ed = 0;
  for (i = 1; i <= m; i++) {
    int u = find(e[i].u), v = find(e[i].v);
    if (u == v) continue;
    f[u] = v, G[++ed] = i;
    if (e[i].u == 1) ++d;
  }
  return d;
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  int w = 0;
  for (i = 1; i <= m; i++) {
    E[i].u = gi(), E[i].v = gi(), E[i].c = gi();
    E[i].i = i;
    if (E[i].u > E[i].v) swap(E[i].u, E[i].v);
    if (E[i].u == 1) w++;
  }
  G[n - 1] = -1, Check(0);
  if (n == 1 && !k) {
    printf("0");
    return 0;
  }
  if (w < k || G[n - 1] == -1 || !k) {
    printf("-1\n");
    return 0;
  }
  double l = -1000000, r = 1000000;
  int cnt = 0, s;
  while (cnt <= 500) {
    ++cnt;
    double mid = (l + r) / 2;
    s = Check(mid);
    if (s == k) break;
    if (Check(mid) > k)
      l = mid;
    else
      r = mid;
  }
  if (s != k) {
    printf("-1");
    return 0;
  }
  printf("%d\n", n - 1);
  for (i = 1; i < n; i++) printf("%d ", e[G[i]].i);
  return 0;
}
