#include using namespace std; typedef long long i64; typedef unsigned long long ui64; typedef vector vi; typedef vector vvi; typedef pair pi; #define pb push_back #define sz(a) i64((a).size()) #define all(c) (c).begin(), (c).end() #define REP(s, e, i) for(i=(s); i < (e); ++i) inline void RI(i64 &i) {scanf("%lld", &(i));} inline void RVI(vi &v) { for(i64 i=0;i inline bool IN(T &S, const typename T::key_type &key) { return S.find(key) != S.end(); } template inline bool ON(const T &b, i64 idx) { return ((T(1) << idx) & b) != 0; } int main(int argc, char *argv[]) { i64 i, j, k; i64 N, S, T, K; cin >> N >> S >> T >> K; --S; --T; vi X(N); RVI(X); vector> edges(N); vector> r_edges(N); i64 M; cin >> M; REP(0, M, i) { i64 a, b, y; RI(a); RI(b); RI(y); --a; --b; edges[a].pb({b, y}); r_edges[b].pb({a, y}); } auto update = [](const pi &a, const pi &b) { if(b.first == -1) { return a; } if(a.first == -1) { return b; } if(b.first < a.first) { return b; } return a; }; // BFS part vector> TS(K, vector(N, {-1, -1})); TS[0][S] = {X[S], -1}; REP(0, K-1, k) { REP(0, N, i) { if(TS[k][i].first >= 0) { for(auto &e: edges[i]) { i64 n = e.first, w = e.second; TS[k+1][n] = update(TS[k+1][n], {TS[k][i].first + w + X[n], i}); } } } } // dijkstra part vector D(N, pi(-1, -1)); using ppi = pair; priority_queue, greater> pq; D[T] = {0, -1}; pq.push({D[T], T}); while(!pq.empty()) { auto c = pq.top(); pq.pop(); i64 cur = c.second; pi d = c.first; if(d != D[cur]) { continue; } for(auto &e: r_edges[cur]) { i64 n = e.first, w = e.second; i64 dn = d.first + X[cur] + w; if(D[n].first == -1 || dn < D[n].first) { D[n] = {dn, cur}; pq.push({{dn, cur}, n}); } } } i64 idx = -1, m = -1; REP(0, N, i) { if(TS[K-1][i].first != -1 && D[i].first != -1) { i64 candidate = TS[K-1][i].first + D[i].first; if(m == -1 || candidate < m) { m = candidate; idx = i; } } } if(idx == -1) { WS("Impossible"); } else { vi ans; k = K-1; i64 prev = idx; while(k >= 0) { ans.push_back(prev+1); prev = TS[k][prev].second; --k; } reverse(all(ans)); i64 next = D[idx].second; while(next != -1) { ans.push_back(next+1); next = D[next].second; } //cerr << idx+1 << endl; WS("Possible"); WI(m); WI(sz(ans)); WVI(ans); } return 0; }