#include <bits/stdc++.h>
using namespace std;
const int inf = 1000000000, N = 2000;
struct interval {
  int x, l, r;
  pair<int, pair<int, int> > get_pair() const {
    return make_pair(x, make_pair(l, r));
  }
  bool operator<(interval oth) const { return get_pair() < oth.get_pair(); }
};
int n, m, fen[3 * N + 5];
pair<int, int> a[N + 5], b[N + 5];
interval blu[N + 5], red[N + 5];
vector<int> vals;
int get(int x) {
  return lower_bound(vals.begin(), vals.end(), x) - vals.begin() + 1;
}
void upd(int x) {
  x = get(x);
  for (; x <= vals.size(); x += x & -x) fen[x]++;
}
int que(int l, int r) {
  l = get(l);
  r = get(r);
  int ans = 0;
  for (; r; r -= r & -r) ans += fen[r];
  for (l--; l; l -= l & -l) ans -= fen[l];
  return ans;
}
int merge(interval *a, int n) {
  int k = 0;
  sort(a + 1, a + n + 1);
  for (int i = 1; i <= n;) {
    int j = i;
    int end = a[i].r;
    for (; j <= n && a[j].x == a[i].x && a[j].l <= end; j++) {
      end = max(end, a[j].r);
    }
    a[++k] = (interval){a[i].x, a[i].l, end};
    i = j;
  }
  return k;
}
bool check(int t) {
  vals.clear();
  for (int i = 1; i <= n; i++) {
    blu[i] =
        (interval){a[i].first + a[i].second, a[i].first - a[i].second - 2 * t,
                   a[i].first - a[i].second + 2 * t};
    vals.push_back(blu[i].x);
  }
  for (int i = 1; i <= m; i++) {
    red[i] =
        (interval){b[i].first - b[i].second, b[i].first + b[i].second - 2 * t,
                   b[i].first + b[i].second + 2 * t};
    vals.push_back(red[i].l);
    vals.push_back(red[i].r);
  }
  int nn = merge(blu, n);
  int mm = merge(red, m);
  for (int i = 1; i <= nn; i++) vals.push_back(blu[i].x);
  for (int i = 1; i <= mm; i++) {
    vals.push_back(red[i].l);
    vals.push_back(red[i].r);
  }
  sort(vals.begin(), vals.end());
  vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
  for (int i = 1; i <= mm; i++) {
    memset(fen, 0, sizeof fen);
    vector<pair<int, int> > v;
    for (int j = 1; j <= nn; j++) {
      if (blu[j].l <= red[i].x) v.push_back(make_pair(blu[j].r, blu[j].x));
    }
    sort(v.rbegin(), v.rend());
    int k = 0;
    for (int j = mm; j > i; j--) {
      for (; k < v.size() && v[k].first >= red[j].x; k++) {
        if (que(v[k].second, v[k].second) == 0) upd(v[k].second);
      }
      int x = max(red[i].l, red[j].l), y = min(red[i].r, red[j].r);
      if (x <= y && que(x, y) >= 2) return true;
    }
  }
  return false;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d %d", &a[i].first, &a[i].second);
  for (int i = 1; i <= m; i++) scanf("%d %d", &b[i].first, &b[i].second);
  int le = 1, ri = 500000000;
  while (le + 1 < ri) {
    int mi = (le + ri) / 2;
    if (check(mi))
      ri = mi;
    else
      le = mi + 1;
  }
  if (check(le)) ri = le;
  if (ri < 500000000)
    cout << ri << endl;
  else
    cout << "Poor Sereja!" << endl;
  return 0;
}
