rt,包括 Subtask 1 和讨论区所有 hack
#include <bits/stdc++.h>
using namespace std;
// #define CF
#define ll long long
#define ul unsigned ll
#define LL __int128_t
#define db double
#define DB long db
#define pii pair<int, int>
#define fi first
#define se second
#define mkpr make_pair
#define mem(a, x) memset(a, x, sizeof(a))
#define rep(i, l, r) for (int i(l), i##End(r); i <= i##End; i = -~i)
#define per(i, r, l) for (int i(r), i##End(l); i >= i##End; i = ~-i)
template<typename T, typename U> void chkmx(T &_a, U _b) { if (_a < _b) _a = _b; }
template<typename T, typename U> void chkmn(T &_a, U _b) { if (_a > _b) _a = _b; }
constexpr int N = 50005, M = 500005;
constexpr ll mod = 998244353, INF = 0x3f3f3f3f3f3f3f3f;
int n, m, s, k, ans;
struct edge { int u, v, w; } e[M];
int fa[N], wt[N];
multiset<int> S;
int fdrt(int i) { return i == fa[i] ? i : fa[i] = fdrt(fa[i]); }
void solve() {
scanf("%d%d%d%d", &n, &m, &s, &k);
rep(i, 1, m) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
rep(i, 1, n) fa[i] = i, wt[i] = INF;
rep(i, 1, m) if (e[i].u == s || e[i].v == s) wt[(e[i].u == s ? e[i].v : e[i].u)] = e[i].w;
sort(e + 1, e + m + 1, [](edge a, edge b) { return a.w < b.w; } );
rep(i, 1, n) if (i != s) S.insert(wt[i]);
rep(i, 1, m) {
auto [u, v, w] = e[i]; if (u == s || v == s) continue;
if (u = fdrt(u), v = fdrt(v); u == v || (S.size() == k && wt[u] != (int)INF && wt[v] != (int)INF)) continue;
ans += w, fa[u] = v, S.erase(S.find(max(wt[u], wt[v]))), chkmn(wt[v], wt[u]);
if (S.size() == k) break;
} if (S.size() != k) { puts("Impossible"); return; }
for (auto x : S) ans += x; printf("%d\n", ans);
}
void init() {}
int main() {
init();
#ifdef CF
int _; scanf("%d", &_);
while (_--) solve();
#else
solve();
#endif
return 0;
}