#include <bits/stdc++.h>
using namespace std;
int n, m;
struct Dsu {
  int fa[2005];
  void init(int n) {
    for (int(i) = 0; (i) < (int)(n); ++(i)) fa[i] = i;
  }
  int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
  void merge(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) return;
    fa[y] = x;
  }
} ds;
struct Point {
  int x, y;
  Point() {}
  Point(int x, int y) : x(x), y(y) {}
  void read() {
    scanf("%d%d", &x, &y);
    int nx = x, ny = y;
    x = nx - ny, y = nx + ny;
  }
  Point getHA(int t) { return Point(x - t - t, y); }
  Point getHB(int t) { return Point(x + t + t, y); }
  Point getVA(int t) { return Point(x, y + t + t); }
  Point getVB(int t) { return Point(x, y - t - t); }
} Hor[2005], Ver[2005];
struct Segment {
  Point a, b;
  void show() { printf("(%d %d) -- (%d %d)\n", a.x, a.y, b.x, b.y); }
} SH[2005], SV[2005];
int Cnt[2005][2005];
inline bool interSecH(Segment A, Segment B) {
  return A.a.y == B.a.y && !(A.b.x < B.a.x || A.a.x > B.b.x);
}
inline bool interSecV(Segment A, Segment B) {
  return A.a.x == B.a.x && !(A.b.y > B.a.y || A.a.y < B.b.y);
}
inline bool interSec(Segment h, Segment v) {
  return v.a.y >= h.a.y && v.b.y <= h.a.y && h.a.x <= v.a.x && h.b.x >= v.a.x;
}
bool okok(int t) {
  for (int(i) = 0; (i) < (int)(n); ++(i))
    SH[i] = (Segment){Hor[i].getHA(t), Hor[i].getHB(t)};
  for (int(i) = 0; (i) < (int)(m); ++(i))
    SV[i] = (Segment){Ver[i].getVA(t), Ver[i].getVB(t)};
  int hcnt = 0, vcnt = 0;
  ds.init(n);
  for (int(i) = 0; (i) < (int)(n); ++(i))
    for (int(j) = (i + 1); (j) < (int)(n); ++(j))
      if (interSecH(SH[i], SH[j])) {
        if (SH[i].a.x > SH[j].a.x) SH[i].a = SH[j].a;
        if (SH[i].b.x < SH[j].b.x) SH[i].b = SH[j].b;
        ds.merge(i, j);
      }
  for (int(i) = 0; (i) < (int)(n); ++(i))
    if (ds.find(i) == i) SH[hcnt++] = SH[i];
  ds.init(m);
  for (int(i) = 0; (i) < (int)(m); ++(i))
    for (int(j) = (i + 1); (j) < (int)(m); ++(j))
      if (interSecV(SV[i], SV[j])) {
        if (SV[i].a.y < SV[j].a.y) SV[i].a = SV[j].a;
        if (SV[i].b.y > SV[j].b.y) SV[i].b = SV[j].b;
        ds.merge(i, j);
      }
  for (int(i) = 0; (i) < (int)(m); ++(i))
    if (ds.find(i) == i) SV[vcnt++] = SV[i];
  for (int(i) = 0; (i) < (int)(hcnt); ++(i))
    for (int(j) = (i + 1); (j) < (int)(hcnt); ++(j)) Cnt[i][j] = 0;
  static int tmp[2005];
  for (int(i) = 0; (i) < (int)(vcnt); ++(i)) {
    int k = 0;
    for (int(j) = 0; (j) < (int)(hcnt); ++(j))
      if (interSec(SH[j], SV[i])) tmp[k++] = j;
    for (int(i) = 0; (i) < (int)(k); ++(i))
      for (int(j) = (i + 1); (j) < (int)(k); ++(j))
        if (++Cnt[tmp[i]][tmp[j]] == 2) return 1;
  }
  return 0;
}
int main(int argc, char const *argv[]) {
  scanf("%d%d", &n, &m);
  for (int(i) = 0; (i) < (int)(n); ++(i)) Hor[i].read();
  for (int(i) = 0; (i) < (int)(m); ++(i)) Ver[i].read();
  int l = 1, r = 1000001;
  while (l < r) {
    int mid = (l + r) >> 1;
    if (okok(mid))
      r = mid;
    else
      l = mid + 1;
  }
  if (l == 1000001)
    puts("Poor Sereja!");
  else
    printf("%d\n", l);
  return 0;
}
