#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;

const long long MOD = 1000000007LL;
const long long INF = 1e18;

int GCD(int a, int b){return b == 0 ? a : GCD(b, a % b);}
long long fast_exp(long long base, long long exp, long long mod = MOD) {
    long long tot = 1;
    for(;exp > 0;exp >>= 1) {
       if((exp & 1) == 1) tot = tot * base % mod;
       base = base * base % mod;
    }
    return tot;
}
long long slow_mult(long long base, long long exp, long long mod = MOD) {
    long long tot = 0;
    for(;exp > 0;exp >>= 1){
       if((exp & 1) == 1) tot = (tot + base) % mod;
       base = base * 2 % mod;
    }
    return tot;
}

struct chash {
    static uint64_t splitmix64(uint64_t x) {x += 0x8e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf54876d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31);}
    size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM);}
    size_t operator()(pair<uint64_t,uint64_t> x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x.first + FIXED_RANDOM)^(splitmix64(x.second + FIXED_RANDOM) >> 1);}
};

long long arr[100005];
int dsu[100005], ranks[100005], positions[100005];

int find(int node){
    if(dsu[node] == node) return node;
    return dsu[node] = find(dsu[node]);
}

void combine(int a, int b){
    a = find(a); b = find(b);
    if(a == b) return;
    if(ranks[a] <= ranks[b]){
        dsu[a] = b; ranks[b] += ranks[a]; arr[b] += arr[a];
        positions[b] = min(positions[b], positions[a]);
    } else {
        dsu[b] = a; ranks[a] += ranks[b]; arr[a] += arr[b];
        positions[a] = min(positions[b], positions[a]);
    }
}

int main(){

    cin.sync_with_stdio(0); cin.tie(0); cout.tie(0);

    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);

    int n;
    long long l;
    cin >> n >> l;

    priority_queue<vector<long long>> pq;

    for(int i = 0; i < n; ++i){
        cin >> arr[i];
        if(i > 0)
            pq.push({arr[i - 1] + arr[i], i});
        dsu[i] = positions[i] = i;
        ranks[i] = 1;
    }

    vector<int> actions;
    bitset<100005> cut;

    while(!pq.empty()){
        vector<long long> state = pq.top(); pq.pop();
        long long cost = state[0], pos = state[1];
        if(cut[pos]) continue;
        if(cost < l) continue;
        //cout << "UNION " << pos << " " << cost << endl;
        actions.push_back(pos);
        cut[pos] = 1;
        combine(pos, pos - 1);
        if(positions[find(pos)] > 0)
            pq.push({cost + arr[positions[find(pos)] - 1], positions[find(pos)]});
        if(positions[find(pos)] + ranks[find(pos)] < n)
            pq.push({cost + arr[positions[find(pos)] + ranks[find(pos)]], positions[find(pos)] + ranks[find(pos)]});
    }

    if(actions.size() < n - 1){
        cout << "Impossible";
        return 0;
    }

    cout << "Possible\n";

    for(;!actions.empty(); actions.pop_back())
        cout << actions.back() << "\n";

    return 0;
}


Measured memory_bytes: 14512