solution

最短距離が$2$か判定すればよい。つまり島$1, N$の両方に隣接する島の存在を調べればよい。$O(N + M)$。

implementation

#include <cstdio>
#include <set>
#include <vector>
#define repeat(i, n) for (int i = 0; (i) < int(n); ++(i))
using namespace std;

int main() {
    int n, m; scanf("%d%d", &n, &m);
    vector<set<int> > g(n);
    repeat (i, m) {
        int a, b; scanf("%d%d", &a, &b); -- a; -- b;
        g[a].insert(b);
        g[b].insert(a);
    }
    bool result = false;
    for (int k : g[0]) {
        if (g[k].count(n - 1)) {
            result = true;
            break;
        }
    }
    printf("%s\n", result ? "POSSIBLE" : "IMPOSSIBLE");
    return 0;
}