#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e05 + 10;
int a[maxn];
int b[maxn];
int n;
long long m;
int check_d(int *a, int tmp, int d) {
  int y = (tmp + d) % m;
  int first = tmp;
  int cnt(1);
  while (binary_search(a, a + n, y)) {
    ++cnt;
    y = (y + d) % m;
  }
  y = (tmp - d + m) % m;
  while (binary_search(a, a + n, y)) {
    ++cnt;
    first = y;
    y = (y - d + m) % m;
  }
  if (cnt != n)
    return -1;
  else
    return first;
}
long long KPow(int x, int y) {
  if (y == 0) return 1;
  long long tmp = x;
  long long tot = 1;
  while (y) {
    if (y & 1) tot = (tot * tmp) % m;
    tmp = (tmp * tmp) % m;
    y >>= 1;
  }
  return tot % m;
}
pair<int, int> solve(int *a) {
  int cnt = 0;
  sort(a, a + n);
  int x = a[1] - a[0];
  for (int i = 0; i < n; i++)
    if (binary_search(a, a + n, (a[i] + x) % m)) cnt++;
  int k = n - cnt;
  int d = x * 1ll * (KPow(k, m - 2)) % m;
  int first = check_d(a, a[0], d);
  return make_pair(first, (d + m) % m);
}
int main() {
  cin >> m >> n;
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  pair<int, int> cur = make_pair(-1, -1);
  if (n == 1 || m == n) {
    cout << a[0] << " " << 1;
    return 0;
  }
  if (2 * n < m) {
    cur = solve(a);
  } else {
    sort(a, a + n);
    int cnt = 0;
    for (int i = 0; i < m; i++)
      if (!binary_search(a, a + n, i)) b[cnt++] = i;
    n = m - n;
    cur = solve(b);
    if (cur.first != -1) cur.first = (cur.first + 1ll * cur.second * n) % m;
  }
  if (cur.first == -1) {
    cout << -1;
  } else
    cout << cur.first << " " << cur.second;
  return 0;
}
