#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
map<int, int> ma;
int a[N];
int b[N];
int n, m;
bool vis[N];
int dfs(int p, int x) {
  vis[ma[p]] = 1;
  int l = (p - x);
  while (l < 0) l = (l + m) % m;
  int r = (p + x) % m;
  if (ma.count(r) && ma[r] != 0 && !vis[ma[r]]) dfs(r, x);
  if (ma.count(l) && ma[l] != 0 && !vis[ma[l]]) return dfs(l, x);
  return p;
}
long long mi(long long a, long long b) {
  long long t = 1;
  for (; b; b >>= 1) {
    if (b & 1) t = t * a % m;
    a = a * a % m;
  }
  return t;
}
bool check() {
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) return false;
  }
  return true;
}
int main() {
  ma.clear();
  cin >> m >> n;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &b[i]);
    ma[b[i]] = i;
  }
  int nn = n;
  if (2 * nn > m) {
    n = 0;
    for (int i = 0; i <= m - 1; i++) {
      if (ma.count(i)) {
        ma.erase(ma.find(i));
      } else {
        b[++n] = i;
        ma[i] = n;
      }
    }
  }
  if (n == 0) {
    printf("1 1\n");
    return 0;
  }
  memcpy(a, b, sizeof(a));
  int x = a[1] - a[2];
  while (x < 0) x = (x + m) % m;
  int k = 0;
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i <= n; i++) {
    if (vis[i] == 0) k++;
    dfs(a[i], x);
  }
  int kr = mi(k, m - 2);
  int d = 1LL * kr * x % m;
  memset(vis, 0, sizeof(vis));
  int st = dfs(a[1], d);
  if (!check()) {
    printf("-1\n");
    return 0;
  } else {
    if (2 * nn > m) {
      st = (st + 1LL * d * n) % m;
    }
    printf("%d %d\n", st, d);
  }
  return 0;
}
