#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2005;
const int MAXM = 2000000;
int n, m;
struct node {
  int l, r, v;
  node(int a, int b, int c) : l(a), r(b), v(c) {}
};
vector<int> x[MAXN];
vector<int> y[MAXN];
int top1, top2;
int has[MAXN][2];
int to[MAXM * 2 + 5][2];
vector<node> xx;
vector<node> yy;
struct node2 {
  int l, r, u, d, x, y;
  node2(int a, int b, int c, int e, int f, int g)
      : l(a), r(b), d(c), u(e), x(f), y(g) {}
};
vector<node2> xt[MAXN];
vector<node2> yt[MAXN];
int check(int t) {
  xx.clear();
  yy.clear();
  for (int i = 0; i < MAXN; i++) {
    xt[i].clear();
    yt[i].clear();
  }
  for (int i = 0; i < top2; i++) {
    int L = y[i].size();
    if (L == 0) continue;
    int l = y[i][0] - t;
    int r = y[i][0] + t;
    for (int j = 1; j < L; j++) {
      if (r >= y[i][j] - t)
        r = y[i][j] + t;
      else {
        yy.push_back(node(l, r, has[i][1]));
        l = y[i][j] - t;
        r = y[i][j] + t;
      }
    }
    yy.push_back(node(l, r, has[i][1]));
  }
  for (int i = 0; i < top1; i++) {
    int L = x[i].size();
    if (L == 0) continue;
    int l = x[i][0] - t;
    int r = x[i][0] + t;
    for (int j = 1; j < L; j++) {
      if (r >= x[i][j] - t)
        r = x[i][j] + t;
      else {
        xx.push_back(node(l, r, has[i][0]));
        l = x[i][j] - t;
        r = x[i][j] + t;
      }
    }
    xx.push_back(node(l, r, has[i][0]));
  }
  int L1 = yy.size();
  int L2 = xx.size();
  for (int i = 0; i < L1; i++) {
    int y1 = yy[i].v;
    for (int j = 0; j < L2; j++) {
      int x1 = xx[j].v;
      if (x1 >= yy[i].l && x1 <= yy[i].r && y1 >= xx[j].l && y1 <= xx[j].r) {
        xt[to[x1][0]].push_back(
            node2(yy[i].l, yy[i].r, xx[j].l, xx[j].r, x1, y1));
        yt[to[y1][1]].push_back(
            node2(yy[i].l, yy[i].r, xx[j].l, xx[j].r, x1, y1));
      }
    }
  }
  for (int i = 0; i < top2; i++) {
    L1 = yt[i].size();
    if (L1 < 2) continue;
    for (int j = 0; j < L1 - 1; j++) {
      int id = to[yt[i][j].x][0];
      L2 = xt[id].size();
      if (L2 < 2) continue;
      int kk1 = 0;
      for (; kk1 < L2; kk1++)
        if (xt[id][kk1].y > yt[i][j].y) break;
      if (kk1 == L2) continue;
      for (int k = j + 1; k < L1; k++) {
        for (int kk = kk1; kk < L2; kk++) {
          int id2 = to[yt[i][k].x][0];
          int ssz = xt[id2].size();
          for (int kkk = 0; kkk < ssz; kkk++) {
            if (xt[id2][kkk].y == xt[id][kk].y) {
              if (xt[id][kk].r >= xt[id2][kkk].l &&
                  xt[id][kk].d <= yt[i][j].u && xt[id2][kkk].d <= yt[i][k].u &&
                  yt[i][j].r >= yt[i][k].l)
                return 1;
            }
          }
        }
      }
    }
  }
  return 0;
}
vector<pair<int, int> > q1, q2;
int main() {
  int u, v;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &u, &v);
    q1.push_back(make_pair(MAXM + u + v, MAXM + u - v));
  }
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &u, &v);
    q2.push_back(make_pair(MAXM + u - v, MAXM + u + v));
  }
  sort(q1.begin(), q1.end());
  sort(q2.begin(), q2.end());
  int L = q1.size();
  for (int i = 0; i < L; i++) {
    x[top1].push_back(q1[i].second);
    has[top1][0] = q1[i].first;
    to[q1[i].first][0] = top1;
    if (i + 1 == L || q1[i].first != q1[i + 1].first) {
      ++top1;
    }
  }
  L = q2.size();
  for (int i = 0; i < L; i++) {
    y[top2].push_back(q2[i].second);
    has[top2][1] = q2[i].first;
    to[q2[i].first][1] = top2;
    if (i + 1 == L || q2[i].first != q2[i + 1].first) {
      ++top2;
    }
  }
  for (int i = 0; i < top1; i++) sort(x[i].begin(), x[i].end());
  for (int i = 0; i < top2; i++) sort(y[i].begin(), y[i].end());
  int l = 1, r = MAXM * 2;
  int ans = 0;
  while (l <= r) {
    int m = l + r >> 1;
    if (check(m)) {
      ans = m;
      r = m - 1;
    } else
      l = m + 1;
  }
  if (ans == 0)
    printf("Poor Sereja!\n");
  else
    printf("%d\n", (ans + 1) / 2);
  return 0;
}
