#include <bits/stdc++.h>
using namespace std;
int rd() { return RAND_MAX == 32767 ? ((rand() << 15) ^ rand()) : rand(); }
const int maxn = 10010;
int n, m;
int h[maxn], ins[maxn];
struct Point {
  int x, y;
  void read() {
    int X, Y;
    cin >> X >> Y;
    x = X - Y;
    y = X + Y;
  }
} a[maxn], b[maxn];
struct LineX {
  int x0, x1, y;
  LineX() {}
  LineX(int x0_, int x1_, int y_) : x0(x0_), x1(x1_), y(y_) {}
  bool operator<(const LineX &o) const { return y < o.y; }
};
struct LineY {
  int y0, y1, x;
  LineY() {}
  LineY(int y0_, int y1_, int x_) : y0(y0_), y1(y1_), x(x_) {}
  bool operator<(const LineY &o) const { return y1 < o.y1; }
};
bool cmpX(Point u, Point v) { return u.x < v.x || (u.x == v.x && u.y < v.y); }
bool cmpY(Point u, Point v) { return u.y < v.y || (u.y == v.y && u.x < v.x); }
int check(int L) {
  vector<LineX> lx;
  vector<LineY> ly;
  for (int i = 0, j; i < n; i = j) {
    for (j = i + 1; j < n && a[i].y == a[j].y && a[j - 1].x + L * 4 >= a[j].x;
         j++)
      ;
    lx.push_back(LineX(a[i].x - L * 2, a[j - 1].x + L * 2 + 1, a[i].y));
  }
  for (int i = 0, j; i < m; i = j) {
    for (j = i + 1; j < m && b[i].x == b[j].x && b[j - 1].y + L * 4 >= b[j].y;
         j++)
      ;
    ly.push_back(LineY(b[i].y - L * 2, b[j - 1].y + L * 2, b[i].x));
  }
  sort(lx.begin(), lx.end());
  sort(ly.begin(), ly.end());
  vector<int> hx;
  for (int i = 0; i < lx.size(); i++) {
    hx.push_back(lx[i].x0);
    hx.push_back(lx[i].x1);
  }
  for (int i = 0; i < ly.size(); i++) hx.push_back(ly[i].x);
  sort(hx.begin(), hx.end());
  hx.resize(unique(hx.begin(), hx.end()) - hx.begin());
  int nx = hx.size();
  for (int i = 0; i < lx.size(); i++) {
    lx[i].x0 = lower_bound(hx.begin(), hx.end(), lx[i].x0) - hx.begin();
    lx[i].x1 = lower_bound(hx.begin(), hx.end(), lx[i].x1) - hx.begin();
  }
  for (int i = 0; i < ly.size(); i++)
    ly[i].x = lower_bound(hx.begin(), hx.end(), ly[i].x) - hx.begin();
  for (int i = 0; i < lx.size(); i++) {
    int k = ly.size() - 1, found = 0;
    for (int j = 0; j <= nx; j++) h[j] = ins[j] = 0;
    for (int j = lx.size() - 1; j > i; j--) {
      if (lx[i].y == lx[j].y) break;
      int Lx = max(lx[i].x0, lx[j].x0), Rx = min(lx[i].x1, lx[j].x1);
      if (Lx >= Rx) continue;
      for (; k >= 0 && ly[k].y1 >= lx[j].y; k--) {
        if (ly[k].y0 > lx[i].y) continue;
        if (!ins[ly[k].x]) {
          ins[ly[k].x] = 1;
          for (int o = nx - ly[k].x; o <= nx; o += o & -o) h[o]++;
        }
      }
      int cnt = 0;
      for (int o = nx - Lx; o; o -= o & -o) cnt += h[o];
      for (int o = nx - Rx; o; o -= o & -o) cnt -= h[o];
      if (cnt > 1) {
        found = 1;
        break;
      }
    }
    if (found) return 1;
  }
  return 0;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) a[i].read();
  for (int i = 0; i < m; i++) b[i].read();
  sort(a, a + n, cmpY);
  sort(b, b + m, cmpX);
  int lt, rt, mid;
  for (lt = 1, rt = 2100000; lt < rt;) {
    mid = (lt + rt) >> 1;
    check(mid) ? rt = mid : lt = mid + 1;
  }
  lt < 2100000 ? cout << lt << endl : cout << "Poor Sereja!" << endl;
  return 0;
}
