public ArrayList<int[]> remoteFriends() {
		// iterate over all user pair
		long t_start = System.currentTimeMillis();
		int c = 0;
		for (int a : friendMap.keySet()) {
			for (int b : friendMap.get(a)) {
				System.out.println(String.format("Calculating user with id %d and %d", a, b));
				int cnt = 0;
				if (a <= b) {
					for (Record ra : User.allUserSet.get(a).records) {
						for (Record rb : User.allUserSet.get(b).records) {
							// 1. calculate the average distance
							double d = ra.distanceTo(rb);
							if (avgDistance.containsKey(a)) {
								if (avgDistance.get(a).containsKey(b)) {
									double ext = avgDistance.get(a).get(b);
									avgDistance.get(a).put(b, ext + d);
								} else {
									avgDistance.get(a).put(b, d);
								}
							} else {
								avgDistance.put(a, new HashMap<Integer, Double>() );
								avgDistance.get(a).put(b, d);
							}
							cnt ++;
						}
					}
					double total = avgDistance.get(a).get(b);
					avgDistance.get(a).put(b, total / cnt);
					
					
					if (total > 100) {
						int[] tuple = { a, b, (int) total };
						distantFriend.add(tuple);
					}
				}
			}
			// monitor process
			c++;
			if (c % (friendMap.size()/10) == 0)
				System.out.println(String.format("Process -- remoteFriends %d0%%", c / (friendMap.size()/10)));
		}
		long t_end = System.currentTimeMillis();
		System.out.println(String.format("Found remote friends in %d seconds", (t_end-t_start)/1000));
		return distantFriend;
	}