#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=5e5+5,inf=1e9;
ll t,n,m,s,k,mid,cnt,val;int fa[N];
struct edge{
int fr,to;ll w;
ll calc(){return w+((fr==s||to==s)?mid:0ll);}
}b[N];
bool cmp(edge x,edge y){return x.calc()<y.calc();}
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void MST(){
sort(b+1,b+m+1,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
cnt=val=0;
for(int i=1,fx,fy;i<=m;i++){
fx=find(b[i].fr),fy=find(b[i].to);
if(fx!=fy){
fa[fx]=fy;
cnt+=(b[i].fr==s||b[i].to==s);
val+=b[i].calc();
}
}
}
int main(){
scanf("%lld%lld%lld%lld",&n,&m,&s,&k);
for(int i=1;i<=m;i++)
scanf("%d%d%lld",&b[i].fr,&b[i].to,&b[i].w);
mid=-inf; MST();
if(cnt<k) return puts("Impossible"),0;
mid=inf; MST();
if(cnt>k) return puts("Impossible"),0;
cnt=val=mid=0;
for(int i=1;i<=n;i++) fa[i]=i;
ll l=-100000,r=100000;
while(l<r){
mid=l+r+1>>1; MST();
if(cnt>=k) l=mid;
else r=mid-1;
}
mid=l; MST();
printf("%lld\n",val-k*mid);
return 0;
}
非常优美,但是最后三个点会 WA
把 Impossible 的特判去了,又 AC 了,但是又没特判了