#include #include using namespace std; #define REP(i, n) for(int(i)=0;(i)<(n);++(i)) #define mp make_pair const int LIM = 100; const int dir[][2] = {{1,0},{0,1},{-1,0},{0,-1}}; int W,H; int board[LIM+1][LIM+1]; pair parent[LIM+1][LIM+1]; const pair NODATA = mp(-1,-1); bool solve(){ REP(y,H) REP(x,W) parent[y][x] = NODATA; REP(y,H) REP(x,W){ if(parent[y][x] != NODATA) continue; int c = board[y][x]; parent[y][x] = mp(x,y); deque > q; q.push_back(mp(x,y)); while(!q.empty()){ int nx = q.front().first, ny = q.front().second; q.pop_front(); REP(d,4){ int mx = nx + dir[d][0]; int my = ny + dir[d][1]; if(mx < 0 || my < 0 || mx >= W || my >= H) continue; if(board[my][mx] != c || parent[ny][nx] == mp(mx,my)) continue; if(parent[my][mx] != NODATA){ return true; } parent[my][mx] = mp(nx,ny); q.push_back(mp(mx,my)); } } } return false; } int main(){ cin >> W >> H; REP(y,H) REP(x,W) cin >> board[y][x]; cout << (solve()?"possible":"impossible") << endl; return 0; }