#include <bits/stdc++.h>
using namespace std;
template <class F, class T>
T convert(F a, int p = -1) {
  stringstream ss;
  if (p >= 0) ss << fixed << setprecision(p);
  ss << a;
  T r;
  ss >> r;
  return r;
}
template <class T>
void db(T a, int p = -1) {
  if (p >= 0) cout << fixed << setprecision(p);
  cout << a << " ";
}
template <class T>
T gcd(T a, T b) {
  T r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <class T>
T sqr(T x) {
  return x * x;
}
template <class T>
T cube(T x) {
  return x * x * x;
}
template <class T>
void upmin(T &t, T f) {
  if (t > f) t = f;
}
template <class T>
void upmax(T &t, T f) {
  if (t < f) t = f;
}
template <class T>
struct Triple {
  T x, y, z;
  Triple() {}
  Triple(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {}
};
template <class T>
Triple<T> euclid(T a, T b) {
  if (b == 0) return Triple<T>(1, 0, a);
  Triple<T> r = euclid(b, a % b);
  return Triple<T>(r.y, r.x - a / b * r.y, r.z);
}
template <class T>
int getbit(T s, int i) {
  return (s >> i) & 1;
}
template <class T>
T onbit(T s, int i) {
  return s | (T(1) << i);
}
template <class T>
T offbit(T s, int i) {
  return s & (~(T(1) << i));
}
template <class T>
int cntbit(T s) {
  return s == 0 ? 0 : cntbit(s >> 1) + (s & 1);
}
const int bfsz = 1 << 16;
char bf[bfsz + 5];
int rsz = 0;
int ptr = 0;
char gc() {
  if (rsz <= 0) {
    ptr = 0;
    rsz = (int)fread(bf, 1, bfsz, stdin);
    if (rsz <= 0) return EOF;
  }
  --rsz;
  return bf[ptr++];
}
void ga(char &c) {
  c = EOF;
  while (!isalpha(c)) c = gc();
}
int gs(char s[]) {
  int l = 0;
  char c = gc();
  while (isspace(c)) c = gc();
  while (c != EOF && !isspace(c)) {
    s[l++] = c;
    c = gc();
  }
  s[l] = '\0';
  return l;
}
template <class T>
bool gi(T &v) {
  v = 0;
  char c = gc();
  while (c != EOF && c != '-' && !isdigit(c)) c = gc();
  if (c == EOF) return false;
  bool neg = c == '-';
  if (neg) c = gc();
  while (isdigit(c)) {
    v = v * 10 + c - '0';
    c = gc();
  }
  if (neg) v = -v;
  return true;
}
const double PI = 2 * acos(0);
const string months[] = {"January",   "February", "March",    "April",
                         "May",       "June",     "July",     "August",
                         "September", "October",  "November", "December"};
const int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int dr[] = {-1, 0, +1, 0, 0};
const int dc[] = {0, +1, 0, -1, 0};
const int inf = (int)1e9 + 5;
const long long linf = (long long)1e17 + 5;
const double eps = 1e-9;
const long long mod = 1000000007LL;
struct Point {
  int id;
  long double x, y;
  Point() {}
  Point(int _id, long double _x, long double _y) : id(_id), x(_x), y(_y) {}
};
int n, m, X1, X2, l[200005];
Point a[200005], b[200005];
int cmp(long double x, long double y) {
  if (abs(x - y) < eps) return 0;
  return x < y ? -1 : +1;
}
long double getdist(Point A, Point B) {
  return sqrt(sqr(A.x - B.x) + sqr(A.y - B.y));
}
int main() {
  scanf("%d %d %d %d", &n, &m, &X1, &X2);
  int y;
  for (__typeof(n) i = (1); i <= (n); ++i) {
    scanf("%d", &y);
    a[i] = Point(i, X1, y);
  }
  for (__typeof(m) i = (1); i <= (m); ++i) {
    scanf("%d", &y);
    b[i] = Point(i, X2, y);
  }
  for (__typeof(m) i = (1); i <= (m); ++i) scanf("%d", &l[i]);
  long double best = linf;
  int best1 = -1, best2 = -1;
  Point O = Point(0, 0, 0);
  for (__typeof(m) i = (1); i <= (m); ++i) {
    int low = 1, high = n, m1, m2, res = -1;
    long double bestdist = linf;
    while (low <= high) {
      m1 = (low + low + high) / 3;
      m2 = (low + high + high) / 3;
      long double d1 = getdist(O, a[m1]) + getdist(a[m1], b[i]);
      long double d2 = getdist(O, a[m2]) + getdist(a[m2], b[i]);
      if (cmp(d1, d2) < 0) {
        if (cmp(bestdist, d1) > 0) {
          bestdist = d1;
          res = m1;
        }
        high = m2 - 1;
      } else {
        if (cmp(bestdist, d2) > 0) {
          bestdist = d2;
          res = m2;
        }
        low = m1 + 1;
      }
    }
    if (bestdist + l[i] < best) {
      best = bestdist + l[i];
      best1 = a[res].id;
      best2 = b[i].id;
    }
  }
  cout << best1 << " " << best2 << endl;
  return 0;
}
