#include #include using namespace std; using namespace atcoder; #define rep(i,n)for (int i = 0; i < int(n); ++i) #define rrep(i,n)for (int i = int(n)-1; i >= 0; --i) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() template void chmax(T& a, const T& b) {a = max(a, b);} template void chmin(T& a, const T& b) {a = min(a, b);} using ll = long long; using P = pair; using VI = vector; using VVI = vector; using VL = vector; using VVL = vector; const unsigned long long INF = 1002003004005006007; template std::pair, std::vector> dijkstra(std::vector>>& to, int s=0) { struct QueElem { int v; unsigned long long c; bool operator<(const QueElem a) const {return c > a.c;} QueElem(int v, unsigned long long c): v(v), c(c) {} }; std::pair, std::vector> res; std::vector& dist = res.first; std::vector& pre = res.second; dist.resize(to.size(), INF); pre.resize(to.size(), -1); std::priority_queue q; dist[s] = 0; pre[s] = -1; q.emplace(s, 0); while(!q.empty()) { QueElem qe = q.top(); q.pop(); int u = qe.v; unsigned long long c = qe.c; if (c > dist[u]) continue; for(auto vc: to[u]) { int v = vc.first; unsigned long long nc = c + vc.second; if (nc < dist[v]) { dist[v] = nc; pre[v] = u; q.emplace(v, nc); } } } return res; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, s, t, k; cin >> n >> s >> t >> k; s--, t--; k--; VI x(n); rep(i, n) cin >> x[i]; int m; cin >> m; vector> to(n * (k + 1)); rep(_, m) { int a, b, y; cin >> a >> b >> y; --a, --b; rep(j, k) { to[(k + 1) * a + j].emplace_back((k + 1) * b + j + 1, y + x[b]); } to[(k + 1) * a + k].emplace_back((k + 1) * b + k, y + x[b]); } auto [dist, pre] = dijkstra(to, (k + 1) * s); if (dist[(k + 1) * t + k] == INF) { cout << "Impossible" << '\n'; return 0; } cout << "Possible" << '\n'; cout << x[s] + dist[(k + 1) * t + k] << '\n'; VI ps; for(int v = (k + 1) * t + k; v != -1; v = pre[v]) { ps.push_back(v / (k + 1)); } int sz = ps.size(); cout << sz << '\n'; rrep(i, sz) cout << ps[i] + 1 << " \n"[i == 0]; }