#include <bits/stdc++.h>
using namespace std;
const int INF = (int)5e6 + 7;
const char no[] = "Poor Sereja!";
void minimize(int &x, const int &y) {
  if (x > y) x = y;
}
void maximize(int &x, const int &y) {
  if (x < y) x = y;
}
struct line {
  int x1, y1, x2, y2;
  line() {
    x1 = 0;
    y1 = 0;
    x2 = 0;
    y2 = 0;
  }
  line(const pair<int, int> &p, int d, bool t) {
    if (t) {
      x1 = p.first;
      x2 = p.first;
      y1 = p.second - 2 * d;
      y2 = p.second + 2 * d;
    } else {
      y1 = p.second;
      y2 = p.second;
      x1 = p.first - 2 * d;
      x2 = p.first + 2 * d;
    }
  }
  bool intersect(const line &a) const {
    if (a.x2 < x1) return (false);
    if (a.x1 > x2) return (false);
    if (a.y2 < y1) return (false);
    if (a.y1 > y2) return (false);
    return (true);
  }
  void join(const line &a) {
    minimize(x1, a.x1);
    maximize(x2, a.x2);
    minimize(y1, a.y1);
    maximize(y2, a.y2);
  }
};
line lred[2020], lblue[2020];
pair<int, int> pred[2020], pblue[2020];
bool same[2020][2020];
int nred, nblue;
bool cmpx(const line &a, const line &b) {
  if (a.x1 < b.x1) return (true);
  if (a.x1 > b.x1) return (false);
  return (a.y1 < b.y1);
}
bool cmpy(const line &a, const line &b) {
  if (a.y1 < b.y1) return (true);
  if (a.y1 > b.y1) return (false);
  return (a.x1 < b.x1);
}
void init(void) {
  scanf("%d", &nblue);
  scanf("%d", &nred);
  for (int i = (1); i <= (nblue); i = i + 1) {
    int x, y;
    scanf("%d", &x);
    scanf("%d", &y);
    pblue[i] = pair<int, int>(x + y, x - y);
  }
  for (int i = (1); i <= (nred); i = i + 1) {
    int x, y;
    scanf("%d", &x);
    scanf("%d", &y);
    pred[i] = pair<int, int>(x + y, x - y);
  }
}
bool ok(int d) {
  for (int i = (1); i <= (nblue); i = i + 1) lblue[i] = line(pblue[i], d, 1);
  for (int i = (1); i <= (nred); i = i + 1) lred[i] = line(pred[i], d, 0);
  memset(same, false, sizeof same);
  sort(lblue + 1, lblue + nblue + 1, cmpx);
  sort(lred + 1, lred + nred + 1, cmpy);
  vector<line> ablue, ared;
  for (int i = (1); i <= (nblue); i = i + 1) {
    if (ablue.empty() || !ablue[ablue.size() - 1].intersect(lblue[i]))
      ablue.push_back(lblue[i]);
    else
      ablue[ablue.size() - 1].join(lblue[i]);
  }
  for (int i = (1); i <= (nred); i = i + 1) {
    if (ared.empty() || !ared[ared.size() - 1].intersect(lred[i]))
      ared.push_back(lred[i]);
    else
      ared[ared.size() - 1].join(lred[i]);
  }
  for (int i = 0; i < (ablue.size()); i = i + 1) {
    vector<int> interid;
    for (int j = 0; j < (ared.size()); j = j + 1)
      if (ablue[i].intersect(ared[j])) interid.push_back(j);
    for (int j = 0; j < (interid.size()); j = j + 1)
      for (int k = (j + 1); k <= (interid.size() - 1); k = k + 1) {
        int x = interid[j];
        int y = interid[k];
        if (same[x][y]) return (true);
        same[x][y] = true;
        same[y][x] = true;
      }
  }
  return (false);
}
void process(void) {
  int l = 0;
  int r = INF;
  if (!ok(INF)) {
    printf("%s", no);
    return;
  }
  while (true) {
    if (l == r) {
      printf("%d", r);
      return;
    }
    if (r - l == 1) {
      if (ok(l))
        printf("%d", l);
      else
        printf("%d", r);
      return;
    }
    int m = (l + r) >> 1;
    if (ok(m))
      r = m;
    else
      l = m + 1;
  }
}
int main(void) {
  init();
  process();
  return 0;
}
