#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e3 + 5;
const int maxm = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const long long mod = 1e9 + 7;
double del;
int cnt;
int cape;
int n, m, k;
struct Edge {
  int u, v, w;
  int id;
  Edge() {}
  Edge(int u, int v, int w, int id) : u(u), v(v), w(w), id(id) {}
  friend bool operator<(Edge x, Edge y) {
    return (x.u == 1 ? x.w + del : x.w) < (y.u == 1 ? y.w + del : y.w);
  }
};
int pre[maxn];
vector<Edge> G;
int ans[maxm];
inline int Find(int x) { return x == pre[x] ? x : pre[x] = Find(pre[x]); }
inline void Kruskal(bool flag) {
  cnt = cape = 0;
  for (int i = 1; i <= n; ++i) pre[i] = i;
  sort(G.begin(), G.end());
  for (int i = 0; i < m; ++i) {
    if (cnt == n - 1) return;
    int px = Find(G[i].u);
    int py = Find(G[i].v);
    if (px != py && (flag || cape + (G[i].u == 1 ? 1 : 0) <= k)) {
      pre[px] = py;
      ans[cnt++] = G[i].id;
      if (G[i].u == 1) cape++;
    }
  }
}
int main() {
  scanf("%d %d %d", &n, &m, &k);
  int tot = 0;
  for (int i = 1; i <= m; ++i) {
    int u, v, w;
    scanf("%d %d %d", &u, &v, &w);
    if (u > v) swap(u, v);
    G.push_back(Edge(u, v, w, i));
    if (u == 1) tot++;
  }
  if (tot < k || n > 1 && k == 0) return printf("-1\n"), 0;
  Kruskal(1);
  if (cnt != n - 1) return printf("-1\n"), 0;
  double l, r;
  l = -1e5;
  r = 1e5;
  while (l + 1e-5 < r && cape != k) {
    del = (l + r) / 2;
    Kruskal(1);
    if (cape < k)
      r = del;
    else
      l = del;
  }
  if (cape != k) del = (l + r) / 2;
  Kruskal(0);
  printf("%d\n", n - 1);
  for (int i = 0; i < n - 1; ++i) {
    printf("%d%c", ans[i], i == n - 2 ? '\n' : ' ');
  }
  return 0;
}
