#include <bits/stdc++.h>
using namespace std;
constexpr static int MAXN = 1e6;
int m, n;
int a[MAXN];
unordered_set<int> aset;
bool check(int x, int d) {
  int j = x;
  for (int i = 0; i < n; i++) {
    if (!aset.count(j)) return false;
    j += d;
    if (j >= m) j -= m;
  }
  return true;
}
int64_t fpow(int64_t x, int64_t e) {
  int64_t r = 1;
  int64_t p = x;
  while (e > 0) {
    if (e & 1) r = r * p % m;
    p = p * p % m;
    e >>= 1;
  }
  return r;
}
int main() {
  scanf("%d%d", &m, &n);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  if (n == m || n == 1) {
    printf("%d 1\n", a[0]);
    return 0;
  }
  for (int i = 0; i < n; i++) aset.insert(a[i]);
  int64_t asum = 0;
  int64_t asum2 = 0;
  int64_t isum = 0;
  int64_t isum2 = 0;
  for (int i = 0; i < n; i++) {
    asum += a[i];
    asum2 += 1LL * a[i] * a[i] % m;
    isum += i;
    isum2 += 1LL * i * i % m;
  }
  asum %= m;
  asum2 %= m;
  isum %= m;
  isum2 %= m;
  int64_t isuminv = fpow(isum, m - 2);
  vector<pair<int, int>> vals;
  for (int i = 0; i < n; i++) {
    int64_t x = a[i];
    int64_t d = (asum - n * x % m + m) % m * isuminv % m;
    int64_t val =
        (n * x % m * x % m + 2 * x * d % m * isum % m + d * d % m * isum2 % m) %
        m;
    if (val == asum2) {
      vals.push_back({x, d});
    }
  }
  for (auto p : vals) {
    int x = p.first;
    int d = p.second;
    if (check(x, d)) {
      printf("%d %d\n", x, d);
      return 0;
    }
  }
  printf("-1\n");
}
