/*
Author: QAQAutomaton
Lang: C++
Code: C.cpp
Mail: lk@qaq-am.com
Blog: https://www.qaq-am.com/
*/
#include<bits/stdc++.h>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define DEBUG printf("Passing [%s] in LINE %d\n",__FUNCTION__,__LINE__)
#define Debug debug("Passing [%s] in LINE %d\n",__FUNCTION__,__LINE__)
#define all(x) x.begin(),x.end()
#define x first
#define y second
using namespace std;
typedef unsigned uint;
typedef long long ll;
typedef unsigned long long ull;
typedef complex<double> cp;
typedef pair<int,int> pii;
int inf;
const double eps=1e-8;
const double pi=acos(-1.0);
template<class T,class T2>int chkmin(T &a,T2 b){return a>b?a=b,1:0;}
template<class T,class T2>int chkmax(T &a,T2 b){return a<b?a=b,1:0;}
template<class T>T sqr(T a){return a*a;}
template<class T,class T2>T mmin(T a,T2 b){return a<b?a:b;}
template<class T,class T2>T mmax(T a,T2 b){return a>b?a:b;}
template<class T>T aabs(T a){return a<0?-a:a;}
template<class T>int dcmp(T a,T b){return a>b;}
template<int *a>int cmp_a(int x,int y){return a[x]<a[y];}
#define min mmin
#define max mmax
#define abs aabs
struct __INIT__{
	__INIT__(){
		fill((unsigned char *)(&inf),(unsigned char *)(&inf)+sizeof(inf),0x3f);
	}
}__INIT___;
namespace io {
	const int SIZE = (1 << 21) + 1;
	char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c, qu[55]; int f, qr;
	// getchar
	#define gc() (iS == iT ? (iT = (iS = ibuf) + fread (ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
	// print the remaining part
	inline void flush () {
		fwrite (obuf, 1, oS - obuf, stdout);
		oS = obuf;
	}
	// putchar
	inline void putc (char x) {
		*oS ++ = x;
		if (oS == oT) flush ();
	}
	template<typename A>
	inline bool read (A &x) {
		for (f = 1, c = gc(); c < '0' || c > '9'; c = gc()) if (c == '-') f = -1;else if(c==EOF)return 0;
		for (x = 0; c <= '9' && c >= '0'; c = gc()) x = x * 10 + (c & 15); x *= f;
		return 1;
	}
	inline bool read (char &x) {
		while((x=gc())==' '||x=='\n' || x=='\r');
		return x!=EOF;
	}
	inline bool read(char *x){
		while((*x=gc())=='\n' || *x==' '||*x=='\r');
		if(*x==EOF)return 0;
		while(!(*x=='\n'||*x==' '||*x=='\r'||*x==EOF))*(++x)=gc();
		*x=0;
		return 1;
	}
	template<typename A,typename ...B>
	inline bool read(A &x,B &...y){
		return read(x)&&read(y...);
	}
	template<typename A>
	inline bool write (A x) {
		if (!x) putc ('0'); if (x < 0) putc ('-'), x = -x;
		while (x) qu[++ qr] = x % 10 + '0',  x /= 10;
		while (qr) putc (qu[qr --]);
		return 0;
	}
	inline bool write (char x) {
		putc(x);
		return 0;
	}
	inline bool write(const char *x){
		while(*x){putc(*x);++x;}
		return 0;
	}
	inline bool write(char *x){
		while(*x){putc(*x);++x;}
		return 0;
	}
	template<typename A,typename ...B>
	inline bool write(A x,B ...y){
		return write(x)||write(y...);
	}
	//no need to call flush at the end manually!
	struct Flusher_ {~Flusher_(){flush();}}io_flusher_;
}
using io :: read;
using io :: putc;
using io :: write;
int s[1<<8|5],atl[1<<8|5];
pii e[100005];
int g[9][9];
int dis[9][9],p[9];
int n,m;
signed main(){
#ifdef QAQAutoMaton 
	freopen("C.in","r",stdin);
	freopen("C.out","w",stdout);
#endif
	read(n,m);
	int mx=0;
	for(int i=0;i<n;++i){
		read(s[1<<i]);
		chkmax(mx,s[1<<i]);
	}
	for(int i=1;i<(1<<n);++i)if(i&(i-1))s[i]=s[i&(i-1)]+s[i&(-i)];
	for(int i=1;i<=m;++i){
		read(e[i].y,e[i].x);
		if(mx>e[i].x)return write("-1\n");
	}
	sort(e+1,e+m+1);
	for(int i=1;i<=m;++i)chkmax(e[i].y,e[i-1].y);
	for(int i=0;i<(1<<n);++i){
		atl[i]=(lower_bound(e+1,e+m+1,make_pair(s[i],-1))-1)->y;
	}
	for(int i=1;i<=n;++i)p[i]=i-1;
	int ans=inf;
	do{
		for(int i=1;i<=n;++i){
			int w=0;
			for(int j=i;j;--j){
				w|=1<<p[j];
				dis[j][i]=-atl[w];
			}
			for(int j=i+1;j<=n;++j)dis[j][i]=inf;
		}
		for(int k=1;k<=n;++k)
			for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)chkmin(dis[i][j],dis[i][k]+dis[k][j]);
		chkmin(ans,-dis[1][n]);
	}while(next_permutation(p+1,p+n+1));
	write(ans,'\n');
	return 0;
}


// Pratiyush Mishra

#include <bits/stdc++.h>
#define ull unsigned long long int
#define ll long long int
#define LL_MAX 9223372036854775807
#define pb push_back
#define pf push_front
#define mp make_pair
#define popb pop_back
#define vl vector<ll>
#define bs(v, x) binary_search(v.begin(), v.end(), x)
#define popf pop_front
#define p() cout << '\n'
#define p0(x) cout << x << " "
#define p1(x) cout << x << '\n'
#define p2(x, y) cout << x << " " << y << '\n'
#define p3(x, y, z) cout << x << " " << y << " " << z << '\n'
#define printv(v)                   \
  for (ll i = 0; i < v.size(); ++i) \
    cout << v[i] << " ";            \
  cout << '\n'
#define pr1(x) cout << fixed << setprecision(15) << x << '\n'
#define mod 1000000007
#define mod1 998244353
#define fio                         \
  ios_base::sync_with_stdio(false); \
  cin.tie(NULL)
#define get(n) \
  ll n;        \
  cin >> n
#define getvec(v, n)         \
  vector<ll> v(n);           \
  for (ll i = 0; i < n; i++) \
    cin >> v[i];
#define getstr(s) \
  string s;       \
  cin >> s
#define all(x) x.begin(), x.end()
#define countBits(x) __builtin_popcount(x)
using namespace std;

void mainSolve()
{
  get(n);
  get(m);
  getvec(wt, n);
  sort(all(wt));
  vector<ll> sum(1 << n, 0), dis(1 << n, 0);
  for (int i = 0; i < (1 << n); i++)
  {
    int x = 0;
    for (int j = 0; j < n; j++)
      if (i >> j & 1)
        x += wt[j];
    sum[i] = x;
  }
  int need = *max_element(all(wt));
  bool flag = true;
  // for (int i = 0; i < m; i++)
  // {
  //   int l, v;
  //   cin >> l >> v;
  //   if (v < need)
  //   {
  //     flag = false;
  //   }
  //   for (int j = 0; j < (1 << n); j++)
  //   {
  //     if (sum[j] > v)
  //       dis[j] = max(dis[j], l);
  //   }
  // }
  for (int j = 0; j < m; j++)
  {
    get(l);
    get(w);
    if (w < need)
      flag = false;
    for (int i = 0; i < (1 << n); i++)
    {
      if (sum[i] > w)
        dis[i] = max(dis[i], l);
    }
  }
  if (!flag)
  {
    p1(-1);
    return;
  }
  ll ans = 1e15;
  vl per(n);
  iota(all(per), 0);
  do
  {
    vl pos(n, 0);
    for (int i = 1; i < n; i++)
    {
      ll s = (1 << per[i]);
      for (int j = i - 1; j >= 0; j--)
      {
        s |= (1 << per[j]);
        pos[i] = max(pos[i], pos[j] + dis[s]);
      }
    }
    ans = min(ans, pos[n - 1]);
  } while (next_permutation(all(per)));
  p1(ans);
}

int main()
{
  fio;
#ifndef ONLINE_JUDGE
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif
  //get(t);
  ll t = 1;
  while (t--)
  {
    mainSolve();
  }
  return 0;
}
