# input = sys.stdin.readline

def resolve():
    from heapq import heappush, heappop

    # 長点数V、直接移動先とコストを記したリストg、スタート地点rをとって、
    # rからiに行くまでの最低コストがdist[i]であることを意味するリストdistを返す関数
    def dijkstra(V, g, r):

        dist = [INF] * V
        queue = [(0, r)]  # queueの要素(c,v)は、コストcで直接vに行けることを意味する
        dist[r] = 0  # スタート地点rにはコスト0で行ける

        while queue:
            c, v = heappop(queue)
            if dist[v] < c:  # すでに記録されているコストの方が小さいので更新不要
                continue
            for cost, t in g[v]:
                if dist[v] + cost < dist[t]:
                    dist[t] = dist[v] + cost
                    heappush(queue, (dist[t], t))

        return dist

    V, E = map(int, input().split())
    r = 0
    g = [[] for i in range(V)]

    for i in range(E):
        s, t = map(int, input().split())
        s, t = s - 1, t - 1
        d = 1
        g[s].append((d, t))
        g[t].append((d, s))  # g[s]の要素(cost,t)はsからコストcostでtに直接行けることを意味する

# input = sys.stdin.readline

def resolve():
    from heapq import heappush, heappop

    # 長点数V、直接移動先とコストを記したリストg、スタート地点rをとって、
    # rからiに行くまでの最低コストがdist[i]であることを意味するリストdistを返す関数
    def dijkstra(V, g, r):

        dist = [INF] * V
        queue = [(0, r)]  # queueの要素(c,v)は、コストcで直接vに行けることを意味する
        dist[r] = 0  # スタート地点rにはコスト0で行ける

        while queue:
            c, v = heappop(queue)
            if dist[v] < c:  # すでに記録されているコストの方が小さいので更新不要
                continue
            for cost, t in g[v]:
                if dist[v] + cost < dist[t]:
                    dist[t] = dist[v] + cost
                    heappush(queue, (dist[t], t))

        return dist

    V, E = map(int, input().split())
    r = 0
    g = [[] for i in range(V)]

    for i in range(E):
        s, t = map(int, input().split())
        s, t = s - 1, t - 1
        d = 1
        g[s].append((d, t))
        g[t].append((d, s))  # g[s]の要素(cost,t)はsからコストcostでtに直接行けることを意味する

    INF = 10 ** 10

    if dijkstra(V, g, r)[-1]==2:
        print('POSSIBLE')
    else:
        print('IMPOSSIBLE')


resolve()
    INF = 10 ** 10

    if dijkstra(V, g, r)[-1]==2:
        print('POSSIBLE')
    else:
        print('IMPOSSIBLE')


resolve()

### FIXED CODE ###


# input = sys.stdin.readline

def resolve():
    from heapq import heappush, heappop

    # 長点数V、直接移動先とコストを記したリストg、スタート地点rをとって、
    # rからiに行くまでの最低コストがdist[i]であることを意味するリストdistを返す関数
    def dijkstra(V, g, r):

        dist = [INF] * V
        queue = [(0, r)]  # queueの要素(c,v)は、コストcで直接vに行けることを意味する
        dist[r] = 0  # スタート地点rにはコスト0で行ける

        while queue:
            c, v = heappop(queue)
            if dist[v] < c:  # すでに記録されているコストの方が小さいので更新不要
                continue
            for cost, t in g[v]:
                if dist[v] + cost < dist[t]:
                    dist[t] = dist[v] + cost
                    heappush(queue, (dist[t], t))

        return dist

    V, E = map(int, input().split())
    r = 0
    g = [[] for i in range(V)]

    for i in range(E):
        s, t = map(int, input().split())
        s, t = s - 1, t - 1
        d = 1
        g[s].append((d, t))
        g[t].append((d, s))  # g[s]の要素(cost,t)はsからコストcostでtに直接行けることを意味する

    INF = 10 ** 10

    if dijkstra(V, g, r)[-1]==2:
        print('POSSIBLE')
    else:
        print('IMPOSSIBLE')


resolve()