import java.util.*;

class Main
{
	//Условная бесконечность
	public static final int INF = 1000000;
	
	public static void main (String[] args)
	{
		Scanner input = new Scanner(System.in);
		int n, m, curFrom, curTo;
		n = input.nextInt();
		
		int price[] = new int[n+1];     //Цены на бензин в i-ом городе
		int distance[] = new int[n+1];  //Минимальные затраты на то, чтобы обраться до i-го города
		boolean used[] = new boolean[n+1]; //Был ли рассмотрен этот город?
		Vector <Integer> graph[] = new Vector[n+1];
		for (int i = 1; i <= n; ++i) {
			price[i] = input.nextInt();
			distance[i] = INF;
			used[i] = false;
			graph[i] = new Vector();
		}
		//Заполнение списка смежности
		m = input.nextInt();
		for (int i = 0; i < m; ++i) {
			curFrom = input.nextInt();
			curTo = input.nextInt();
			graph[curFrom].add(curTo);
			graph[curTo].add(curFrom);
		}
		//Нахождение оптимальной стоимости маршрута. На каждой итерации цикла находим город,
		//стоимость маршрута из начального города к которому минимальна. Если оказывается,
		//что эта стоимость бесконечна, значит, искомого пути не существует.
		distance[1] = 0;
		for(int i = 0; i < n; ++i) {
			int curCity = -1; //Город, рассматривыемый в данной итерации
			for (int j = 1; j <= n; ++j)
				if (!used[j] && (curCity == -1 || distance[j] < distance[curCity])) curCity = j;
			if (distance[curCity] == INF) break;
			used[curCity] = true;
			//Релаксация стоимости маршрута для всех городов, в которые можно попасти из данного
			for(int j = 0; j < graph[curCity].size(); ++j) {
				int to = graph[curCity].elementAt(j); 
				distance[to] = Math.min(distance[to], distance[curCity] + price[curCity]);
			}
		}
		//Вывод ответа
		System.out.print(distance[n] == INF ? -1 : distance[n]);
	}
}