#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
inline int read() {
  int sum = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    sum = (sum << 3) + (sum << 1) + ch - '0';
    ch = getchar();
  }
  return sum * w;
}
struct edge {
  int u, v, id;
  double w, d;
} e[N];
int n, m, k, f[N];
bool vis[N];
int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
bool cmp(edge x, edge y) { return x.w + x.d < y.w + y.d; }
bool check(int x) { return e[x].u == 1 || e[x].v == 1; }
int kruskal(double del) {
  int cnt = 0;
  for (int i = 1; i <= n; i++) f[i] = i;
  for (int i = 1; i <= m; i++) {
    if (check(i)) e[i].d = del;
    vis[i] = 0;
  }
  sort(e + 1, e + m + 1, cmp);
  for (int i = 1; i <= m; i++) {
    int x = find(e[i].u), y = find(e[i].v);
    if (x != y) {
      if (cnt + check(i) <= k) {
        cnt += check(i);
        f[x] = y;
        vis[i] = 1;
      }
    }
  }
  return cnt;
}
int main() {
  n = read(), m = read(), k = read();
  int cnt = 0;
  for (int i = 1; i <= m; i++) {
    e[i].u = read(), e[i].v = read(), e[i].w = read();
    e[i].d = 0, e[i].id = i;
    cnt += check(i);
  }
  if (cnt < k || (n > 1 && k == 0)) {
    puts("-1");
    return 0;
  }
  kruskal(1e5);
  cnt = 0;
  for (int i = 1; i <= m; i++)
    if (vis[i]) cnt++;
  if (cnt != n - 1) {
    puts("-1");
    return 0;
  }
  double l = -1e5, r = 1e5, ans = 0;
  for (int i = 1; i <= 50; i++) {
    double mid = (l + r) / 2;
    if (kruskal(mid) < k)
      r = mid;
    else
      l = mid, ans = mid;
  }
  kruskal(ans);
  printf("%d\n", n - 1);
  for (int i = 1; i <= m; i++)
    if (vis[i]) printf("%d ", e[i].id);
  return 0;
}
