#include using namespace std; typedef long long ll; typedef long double ld; typedef pair ii; typedef vector vi; typedef vector vvi; typedef vector vii; #define x first #define y second #define pb push_back #define eb emplace_back #define rep(i, a, b) for(auto i = (a); i < (b); ++i) #define REP(i, n) rep(i, 0, n) #define all(v) (v).begin(), (v).end() #define rs resize #define DBG(x) cerr << __LINE__ << ": " << #x << " = " << (x) << endl const ld PI = acos(-1.0); template using min_queue = priority_queue, greater>; template int sz(const T& x) { return (int)x.size(); // copy the ampersand(&)! } template ostream& operator<<(ostream& os, vector& v) { os << "\n["; for(T& x : v) os << x << ','; return os << "]\n"; } struct pairhash { public: template size_t operator()(const pair& p) const { size_t lhs = hash()(p.x); size_t rhs = hash()(p.y); return lhs ^ (rhs + 0x9e3779b9 + (lhs << 6) + (lhs >> 2)); } }; uint8_t A[50][4000]; void run() { int w, h; cin >> h >> w; for(int y = 0; y < h; y++) { string s; cin >> s; for(int x = 0; x < w; x++) { A[x][y] = 1 << ((s[x] & 0b10000) >> 3) << ((s[x] & 0b100) >> 2); } } int g = gcd(w, h); for(int x1 = 0; x1 < w; x1++) { for(int y1 = 0; y1 < h; y1++) { for(int x2 = x1 + 1; x2 < w; x2++) { if(A[x1][y1] == A[x2][y1]) continue; uint8_t tmp = A[x1][y1] | A[x2][y1]; for(int y2 = y1 + (x2 - x1) % g; y2 < h; y2 += g) { if((tmp | A[x1][y2] | A[x2][y2]) == 15) { cout << "possible" << endl; return; } } for(int y2 = y1 + (w + x1 - x2) % g; y2 < h; y2 += g) { if((tmp | A[x1][y2] | A[x2][y2]) == 15) { cout << "possible" << endl; return; } } } } } cout << "impossible" << endl; } signed main() { // DON'T MIX "scanf" and "cin"! ios_base::sync_with_stdio(false); cin.tie(NULL); cout << fixed << setprecision(20); run(); return 0; }