import java.io.*; import java.util.*; import java.util.List; public class Main { private static StringTokenizer st; private static BufferedReader br; public static long MOD = 1000000007; private static double EPS = 0.00000000001; public static void print(Object x) { System.out.println(x + ""); } public static void printArr(long[] x) { StringBuilder s = new StringBuilder(); for (int i = 0; i < x.length; i++) { s.append(x[i] + " "); } print(s); } public static void printArr(int[] x) { StringBuilder s = new StringBuilder(); for (int i = 0; i < x.length; i++) { s.append(x[i] + " "); } print(s); } public static void printArr(char[] x) { StringBuilder s = new StringBuilder(); for (int i = 0; i < x.length; i++) { s.append(x[i] + ""); } print(s); } public static String join(Collection<?> x, String space) { if (x.size() == 0) return ""; StringBuilder sb = new StringBuilder(); boolean first = true; for (Object elt : x) { if (first) first = false; else sb.append(space); sb.append(elt); } return sb.toString(); } public static String nextToken() throws IOException { while (st == null || !st.hasMoreTokens()) { String line = br.readLine(); st = new StringTokenizer(line.trim()); } return st.nextToken(); } public static int nextInt() throws IOException { return Integer.parseInt(nextToken()); } public static long nextLong() throws IOException { return Long.parseLong(nextToken()); } public static double nextDouble() throws IOException { return Double.parseDouble(nextToken()); } public static List<Integer> nextInts(int N) throws IOException { List<Integer> ret = new ArrayList<Integer>(); for (int i = 0; i < N; i++) { ret.add(nextInt()); } return ret; } public static void main(String[] args) throws IOException { br = new BufferedReader(new InputStreamReader(System.in)); int T = nextInt(); for (; T > 0; T--) { long N = nextLong(); int A = nextInt(); int B = nextInt(); int C = nextInt(); if (N == 1) { print(0); continue; } long[] maxWith = new long[5000]; maxWith[0] = 1; int ans = -1; for (int i = 1; i < maxWith.length; i++) { maxWith[i] = 0; if (i >= A) maxWith[i] += maxWith[i-A]; if (i >= B) maxWith[i] += maxWith[i-B]; if (i >= C) maxWith[i] += maxWith[i-C]; maxWith[i] = Math.max(maxWith[i], 1); if (maxWith[i] >= N) { ans = i; break; } } print(ans); } } }