#include <bits/stdc++.h>
using namespace std;
bool debug = 1;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
long long ln, lk, lm;
struct point {
  int x, y;
};
point b[2105], r[2105];
bool cmpb(point p, point q) {
  if (p.y == q.y) return p.x < q.x;
  return p.y < q.y;
}
bool cmpr(point p, point q) {
  if (p.x == q.x) return p.y < q.y;
  return p.x < q.x;
}
bool vis[2105][2105];
bool ck(int tm) {
  memset(vis, 0, sizeof vis);
  for (int(i) = 0; (i) < (int)(n); (i)++) {
    int left = b[i].x - 2 * tm;
    int right = b[i].x + 2 * tm;
    for (int j = i + 1; j < n; j++) {
      if (b[i].y != b[j].y) break;
      if (b[j].x - right <= 2 * tm) {
        right = b[j].x + 2 * tm;
        i = j;
      } else
        break;
    }
    vector<int> qs;
    for (int(j) = 0; (j) < (int)(m); (j)++)
      if (r[j].x <= right && r[j].x >= left) {
        int bottom = r[j].y - 2 * tm;
        int top = r[j].y + 2 * tm;
        for (int k = j + 1; k < m; k++) {
          if (r[k].x != r[j].x) break;
          if (r[k].y - top <= 2 * tm) {
            top = r[k].y + 2 * tm;
            j = k;
          } else
            break;
        }
        if (bottom <= b[i].y && b[i].y <= top) {
          qs.push_back(j);
        }
      }
    for (int(j) = 0; (j) < (int)(qs.size()); (j)++)
      for (int k = j + 1; k < qs.size(); k++) {
        if (vis[qs[j]][qs[k]]) return 1;
        vis[qs[j]][qs[k]] = 1;
      }
  }
  return 0;
}
int main() {
  scanf("%d%d", &n, &m);
  int x, y;
  for (int(i) = 0; (i) < (int)(n + m); (i)++) {
    scanf("%d%d", &x, &y);
    if (i < n) {
      b[i].x = x - y;
      b[i].y = x + y;
    } else {
      r[i - n].x = x - y;
      r[i - n].y = x + y;
    }
  }
  sort(b, b + n, cmpb);
  sort(r, r + m, cmpr);
  int l = 1, r = 1e7;
  while (l + 1 < r) {
    int mid = (l + r) / 2;
    if (ck(mid))
      r = mid;
    else
      l = mid + 1;
  }
  if (ck(l))
    printf("%d\n", l);
  else if (ck(r))
    printf("%d\n", r);
  else
    puts("Poor Sereja!");
  return 0;
}
