// Arup Guha
// 4/23/2019
// Solution to 2019 USACO March Silver Problem: Fence Planning

import java.io.*;
import java.util.*;

public class fenceplan {
	
	public static void main(String[] args) throws Exception {
		
		// Get basic information.
		BufferedReader stdin = new BufferedReader(new FileReader("fenceplan.in"));
		StringTokenizer tok = new StringTokenizer(stdin.readLine());
		int n = Integer.parseInt(tok.nextToken());
		int edges = Integer.parseInt(tok.nextToken());
		
		// Read in cow locations.
		int[][] loc = new int[n][2];
		for (int i=0; i<n; i++) {
			tok = new StringTokenizer(stdin.readLine());
			loc[i][0] = Integer.parseInt(tok.nextToken());
			loc[i][1] = Integer.parseInt(tok.nextToken());
		}
		
		// Form dj set and read in edges.
		djset dj = new djset(n);
		for (int i=0; i<edges; i++) {
			tok = new StringTokenizer(stdin.readLine());
			int v1 = Integer.parseInt(tok.nextToken()) - 1;
			int v2 = Integer.parseInt(tok.nextToken()) - 1;
			dj.union(v1,v2);
		}
		
		// See which group everyone is in.
		int[] group = new int[n];
		TreeSet<Integer> vals = new TreeSet<Integer>();
		for (int i=0; i<n; i++) {
			group[i] = dj.find(i);
			vals.add(group[i]);
		}
		
		// Map old id's to new ones.
		TreeMap<Integer,Integer> map = new TreeMap<Integer,Integer>();
		int id=0;
		while (vals.size() > 0) map.put(vals.pollFirst(), id++);
		for (int i=0; i<n; i++) group[i] = map.get(group[i]);
		
		// Keep track of each groups min/max.
		int[] minx = new int[id];
		Arrays.fill(minx, 1000000000);
		int[] maxx = new int[id];
		Arrays.fill(maxx, -1);
		int[] miny = new int[id];
		Arrays.fill(miny, 1000000000);
		int[] maxy = new int[id];
		Arrays.fill(maxy, -1);
		
		// Keep track of each group's min and max.
		for (int i=0; i<n; i++) {
			minx[group[i]] = Math.min(minx[group[i]], loc[i][0]);
			maxx[group[i]] = Math.max(maxx[group[i]], loc[i][0]);
			miny[group[i]] = Math.min(miny[group[i]], loc[i][1]);
			maxy[group[i]] = Math.max(maxy[group[i]], loc[i][1]);			
		}
		
		// Find the smallest bounding rectangle.
		int res = 1000000000;
		for (int i=0; i<id; i++) {
			res = Math.min(res, 2*(maxx[i]-minx[i]) + 2*(maxy[i]-miny[i]));
		}

		// Ta da!
		PrintWriter out = new PrintWriter(new FileWriter("fenceplan.out"));
		out.println(res);
		out.close();
		stdin.close();
	}
}

class djset {
	
	public int[] par;
	public int n;
	
	public djset(int myn) {
		n = myn;
		par = new int[n];
		for (int i=0; i<n; i++)
			par[i] = i;
	}
	
	public void union(int a, int b) {
		int p1 = find(a);
		int p2 = find(b);
		if (p1 == p2) return;
		par[p2] = p1;
	}
	
	public int find(int a) {
		if (a == par[a]) return a;
		return par[a] = find(par[a]);
	}
}
