#include <bits/stdc++.h>
using namespace std;
int N, M;
long long blue[2005][2], red[2005][2];
vector<pair<long long, long long>> merge(vector<pair<long long, long long>> p) {
  vector<pair<long long, long long>> merged;
  for (auto x : p) {
    if (merged.size() == 0 || merged[merged.size() - 1].second < x.first) {
      merged.push_back(x);
    } else {
      merged[merged.size() - 1].second =
          max(merged[merged.size() - 1].second, x.second);
    }
  }
  return merged;
}
bool check(long long m) {
  map<long long, vector<pair<long long, long long>>> blueByY, redByX, blueByY1,
      redByX1;
  for (int i = 0; i < N; i++) {
    blueByY[blue[i][1]].push_back(
        pair<long long, long long>(blue[i][0] - m, blue[i][0] + m));
  }
  for (int i = 0; i < M; i++) {
    redByX[red[i][0]].push_back(
        pair<long long, long long>(red[i][1] - m, red[i][1] + m));
  }
  for (auto &p : blueByY) sort(p.second.begin(), p.second.end());
  for (auto &p : redByX) {
    sort(p.second.begin(), p.second.end());
  }
  for (auto p : blueByY) blueByY1[p.first] = merge(p.second);
  for (auto p : redByX) {
    redByX1[p.first] = merge(p.second);
  }
  vector<vector<long long>> blueFlattened, redFlattened;
  for (auto p : blueByY1)
    for (auto x : p.second)
      blueFlattened.push_back(vector<long long>{p.first, x.first, x.second});
  for (auto p : redByX1)
    for (auto x : p.second)
      redFlattened.push_back(vector<long long>{p.first, x.first, x.second});
  sort(redFlattened.begin(), redFlattened.end());
  vector<vector<long long>> redToBlue(redFlattened.size());
  for (int i = 0; i < blueFlattened.size(); i++)
    for (int j = 0; j < redFlattened.size(); j++) {
      if (redFlattened[j][0] >= blueFlattened[i][1] &&
          blueFlattened[i][0] >= redFlattened[j][1] &&
          blueFlattened[i][0] <= redFlattened[j][2]) {
        redToBlue[j].push_back(i);
      }
    }
  sort(redFlattened.begin(), redFlattened.end());
  for (int i = 0; i < redFlattened.size(); i++)
    for (int j = i + 1; j < redFlattened.size(); j++) {
      if (redFlattened[i][0] < redFlattened[j][0]) {
        int ct = 0;
        for (auto x : redToBlue[i]) {
          if (blueFlattened[x][0] >= redFlattened[j][1] &&
              blueFlattened[x][0] <= redFlattened[j][2] &&
              blueFlattened[x][2] >= redFlattened[j][0]) {
            ct++;
          }
          if (ct >= 2) return true;
        }
      }
    }
  return false;
}
int main(int argc, const char *argv[]) {
  cin >> N >> M;
  for (int i = 0, x, y; i < N; i++) {
    cin >> x >> y;
    blue[i][0] = x - y;
    blue[i][1] = x + y;
  }
  for (int i = 0, x, y; i < M; i++) {
    cin >> x >> y;
    red[i][0] = x - y;
    red[i][1] = x + y;
  }
  long long l = 1, r = 10e12 + 1;
  while (l < r) {
    long long m = (l + r) / 2;
    if (check(2 * m)) {
      r = m;
    } else {
      l = m + 1;
    }
  }
  if (r == 10e12 + 1) {
    cout << "Poor Sereja!" << endl;
  } else {
    cout << l << endl;
  }
  return 0;
}
