#include <iostream>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <bits/stdc++.h>
#include <set>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <map>
#define ll long long
using namespace __gnu_pbds;
using namespace std;
template <class T>
using ordered_set = tree<T , null_type , less<T> , rb_tree_tag , tree_order_statistics_node_update>;
template <class T>
using ordered_set1 = tree<T , null_type , greater<T> , rb_tree_tag , tree_order_statistics_node_update>;
// less<T>/greater<T> = ascending/descending.
// less_equal<>/greater_equal<> for ordered multiset
// ordered_multiset note : s.find(), s.erase() don't work + s.upper_bound() and s.lower_bound() swap jobs;
void fastIO(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
int main() {
    fastIO();
    ll n,sum; cin>>n>>sum;
    vector<ll> v(n);
    vector<ll> v2(n);
    for (ll i = 0; i<n; i++) {
        cin>>v[i];
        v2[i]=v[i];
    }
    sort(v.begin(),v.end());
    ll l=0,r=n-1; bool flag = 0;

    while (l<r) {
        if (v[l]+v[r]>sum) {
            r--;
        }
        else if (v[l]+v[r]<sum) {
            l++;
        }
        else {
            flag = 1;
            break;
        }
    }

    if (flag) {
        ll realL,realR;
        for (ll i = 0; i<n; i++) {
            if (v2[i]==v[l]) {
                realL=i;
                break;
            }
        }
        for (ll i = 0; i<n; i++) {
            if (v2[i]==v[r]) {
                realR=i;
                break;
            }
        }
        cout<<realL+1<<' '<<realR+1;
    }
    else {
        cout<<"IMPOSSIBLE";
    }
}