#include <bits/stdc++.h>
using namespace std;
template <class T>
bool checkMin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool checkMax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
const int INF = 1e9;
const int N = 2000 + 100;
const int M = 1e6;
int n, m;
vector<pair<int, int> > ap;
vector<pair<int, int> > bp;
struct seg {
  seg(int l, int r, int z) : l(l), r(r), z(z) {}
  int l, r, z;
};
bool cmp(const pair<int, int>& p, const pair<int, int>& q) {
  if (p.second != q.second) return p.second < q.second;
  return p.first < q.first;
}
vector<seg> construct(const vector<pair<int, int> >& p, int c, int t) {
  vector<seg> segs;
  int n = p.size();
  for (int i = 0; i < n;) {
    int j = i + 1, k;
    while (j < n && ((c) ? ((p[j]).second) : ((p[j]).first)) ==
                        ((c) ? ((p[j - 1]).second) : ((p[j - 1]).first)))
      j++;
    segs.push_back(seg(((c ^ 1) ? (((p[i])).second) : (((p[i])).first)) - t,
                       ((c ^ 1) ? (((p[i])).second) : (((p[i])).first)) + t,
                       ((c) ? ((p[i]).second) : ((p[i]).first))));
    for (k = i + 1; k < j; k++) {
      if (segs.back().r >= ((c ^ 1) ? (((p[k])).second) : (((p[k])).first)) - t)
        segs.back().r = ((c ^ 1) ? (((p[k])).second) : (((p[k])).first)) + t;
      else
        segs.push_back(seg(((c ^ 1) ? (((p[k])).second) : (((p[k])).first)) - t,
                           ((c ^ 1) ? (((p[k])).second) : (((p[k])).first)) + t,
                           ((c) ? ((p[k]).second) : ((p[k]).first))));
    }
    i = j;
  }
  return segs;
}
bool check(int t) {
  vector<seg> ver = construct(ap, 0, t);
  vector<seg> hor = construct(bp, 1, t);
  for (int i = 0; i < (int)ver.size(); i++) {
    vector<pair<int, int> > events;
    int y1 = ver[i].l, y2 = ver[i].r, x = ver[i].z, j, e;
    multiset<int> mu;
    for (j = 0; j < (int)hor.size(); j++) {
      if (hor[j].l <= x && y1 <= hor[j].z && hor[j].z <= y2) {
        events.push_back(make_pair(hor[j].r, hor[j].z));
        mu.insert(hor[j].z);
      }
    }
    sort(events.begin(), events.end());
    j = 0;
    e = (int)events.size();
    for (int k = i + 1; k < (int)ver.size(); k++) {
      while (j < e && events[j].first < ver[k].z) {
        mu.erase(mu.find(events[j].second));
        j++;
      }
      multiset<int>::iterator h, g;
      int l = max(ver[i].l, ver[k].l);
      int r = min(ver[i].r, ver[k].r);
      if (l <= r) {
        h = mu.lower_bound(l);
        g = mu.upper_bound(r);
        int cnt = 0;
        while (h != g && *h <= r && cnt < 2) {
          cnt++;
          h++;
        }
        if (cnt >= 2) return true;
      }
    }
  }
  return false;
}
int main() {
  while (cin >> n >> m) {
    int x, y;
    for (int i = 0; i < n; i++) {
      cin >> x >> y;
      ap.push_back(make_pair(x + y, x - y));
    }
    for (int i = 0; i < m; i++) {
      cin >> x >> y;
      bp.push_back(make_pair(x + y, x - y));
    }
    sort(ap.begin(), ap.end());
    sort(bp.begin(), bp.end(), cmp);
    int lo = 0, hi = M * 6;
    while (lo < hi) {
      int mid = (lo + hi) / 2;
      if (!check(mid * 2))
        lo = mid + 1;
      else
        hi = mid;
    }
    if (lo >= M * 6)
      puts("Poor Sereja!");
    else
      printf("%d\n", lo);
  }
  return 0;
}
