import heapq INF = 1 << 60 n, s, t, k = map(int, input().split()) s -= 1 t -= 1 x = list(map(int, input().split())) m = int(input()) edges = [] idx = {} vs = [s, (k - 1) * n + t] idx[vs[0]] = 0 idx[vs[1]] = 1 src = 0 dst = 1 for _ in range(m): a, b, y = map(int, input().split()) a -= 1 b -= 1 for i in range(k): u = i * n + a v = min(i + 1, k - 1) * n + b if idx.get(u, None) is None: idx[u] = len(idx) vs.append(u) if idx.get(v, None) is None: idx[v] = len(idx) vs.append(v) edges.append((idx[u], idx[v], y + x[b])) g = [[] for _ in range(len(idx))] for u, v, w in edges: g[u].append((v, w)) dist = [INF for _ in range(len(idx))] dist[src] = x[s] prev = [None for _ in range(len(idx))] hp = [(dist[src], src)] while len(hp) > 0: cd, cur = heapq.heappop(hp) if cd > dist[cur]: continue for nxt, cost in g[cur]: if dist[cur] + cost < dist[nxt]: dist[nxt] = dist[cur] + cost prev[nxt] = cur heapq.heappush(hp, (dist[nxt], nxt)) if dist[dst] < INF: print("Possible") print(dist[dst]) cur = dst order = [] while not cur is None: order.append(vs[cur] % n + 1) cur = prev[cur] order.reverse() print(len(order)) print(*order, sep=" ") else: print("Impossible")