#include <bits/stdc++.h>
using namespace std;
const int SZ = 2010;
struct Line {
  int x, y;
  int minx, maxx, miny, maxy;
  bool intersects(Line a) {
    if (minx > a.maxx) return false;
    if (maxx < a.minx) return false;
    if (miny > a.maxy) return false;
    if (maxy < a.miny) return false;
    return true;
  }
  void makeu(Line b) {
    minx = min(minx, b.minx), maxx = max(maxx, b.maxx);
    miny = min(miny, b.miny), maxy = max(maxy, b.maxy);
  }
  void input() {
    int xx, yy;
    scanf("%d %d", &xx, &yy);
    minx = maxx = x = xx + yy, miny = maxy = y = xx - yy;
  }
} RED[SZ], BLUE[SZ];
int n, m, DS[SZ], cnt[SZ][SZ];
void init(int N) {
  for (int i = 0; i < N + 2; i++) DS[i] = i;
}
void make_union(int x, int y) { DS[DS[x]] = DS[y]; }
int parent(int x) { return (DS[x] == x) ? x : (DS[x] = parent(DS[x])); }
vector<int> X, Y, touched;
bool solve(int t) {
  for (int i = 0; i < n; i++)
    BLUE[i].maxy = 4 * t + (BLUE[i].miny = BLUE[i].y - 2 * t);
  for (int i = 0; i < m; i++)
    RED[i].maxx = 4 * t + (RED[i].minx = RED[i].x - 2 * t);
  X.clear(), Y.clear();
  memset(cnt, 0, sizeof cnt);
  init(n);
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      if (BLUE[i].x != BLUE[j].x) continue;
      if (BLUE[i].intersects(BLUE[j])) {
        BLUE[parent(i)].makeu(BLUE[parent(j)]);
        BLUE[parent(j)].makeu(BLUE[parent(i)]);
        make_union(i, j);
      }
    }
  }
  for (int i = 0; i < n; i++)
    if (parent(i) == i) {
      Y.push_back(i);
    }
  init(m);
  for (int i = 0; i < m; i++) {
    for (int j = i + 1; j < m; j++) {
      if (RED[i].y != RED[j].y) continue;
      if (RED[i].intersects(RED[j])) {
        RED[parent(j)].makeu(RED[parent(i)]);
        RED[parent(i)].makeu(RED[parent(j)]);
        make_union(i, j);
      }
    }
  }
  for (int i = 0; i < m; i++)
    if (parent(i) == i) {
      X.push_back(i);
    }
  int ya = Y.size(), xa = X.size();
  for (int i = 0; i < xa; i++) {
    touched.clear();
    for (int j = 0; j < ya; j++) {
      if (RED[X[i]].intersects(BLUE[Y[j]])) touched.push_back(j);
    }
    int ta = touched.size();
    for (int j = 0; j < ta; j++)
      for (int k = j + 1; k < ta; k++) {
        cnt[touched[j]][touched[k]]++;
        if (cnt[touched[j]][touched[k]] == 2) return true;
      }
  }
  return false;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) BLUE[i].input();
  for (int i = 0; i < m; i++) RED[i].input();
  int low = 1, high = 10000000, mid;
  while (low < high - 1) {
    mid = low + (high - low + 1) / 2;
    if (solve(mid))
      high = mid;
    else
      low = mid + 1;
  }
  if (solve(low)) high = min(low, high);
  if (!solve(high)) {
    printf("Poor Sereja!\n");
  } else
    cout << high << endl;
}
