#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>
using std::cin;using std::cerr;
using std::max;using std::min;
#define N 10
#define M 100005
#define inf 1e9
#define ll long long
#define db double
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
int n,m,A[N],tp[N],mark[N],Sum[N],e[N][N],ans=inf;
struct info
{
	int l,v;
	friend bool operator<(info t1,info t2) {return t1.v<t2.v;}
}B[M];
int find(int v) {int l=0,r=m,mid;for(;l<r;) mid=l+r+1>>1,B[mid].v<v?l=mid:r=mid-1;return l;}
void work(int step)
{
	if(step==n+1)
	{
		for(int i=1;i<=n;i++) Sum[i]=Sum[i-1]+A[tp[i]];
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++) e[i][j]=i>j?-inf:0;
		for(int i=1,p;i<=n;i++)
			for(int j=i+1;j<=n;j++) p=find(Sum[j]-Sum[i-1]),e[i][j]=max(e[i][j],B[p].l);
		for(int k=1;k<=n;k++)
			for(int i=1;i<=n;i++)
				for(int j=1;j<=n;j++) e[i][j]=max(e[i][j],e[i][k]+e[k][j]);
		ans=min(ans,e[1][n]);
		return;
	}
	for(int i=2;i<=n;i++) if(!mark[i]) tp[step]=i,mark[i]=1,work(step+1),mark[i]=0;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&A[i])	;
	for(int i=1;i<=m;i++) scanf("%d%d",&B[i].l,&B[i].v);
	std::sort(A+1,A+1+n),std::sort(B+1,B+1+m),std::reverse(A+1,A+1+n);
	if(A[1]>B[1].v) return puts("-1"),0;
	for(int i=1;i<=m;i++) B[i].l=max(B[i].l,B[i-1].l);
	tp[1]=1,work(2),printf("%d\n",ans);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long

int32_t main(){
    ios::sync_with_stdio(0),cin.tie(0);
    int n,m,ans=1e18,mx=0;
    cin >> n >> m;
    int w[n],p[n];
    for(int i=0;i<n;i++){
    	cin >> w[i];
    	p[i]=i;
    	mx=max(mx,w[i]);
    }
    pair <int,int> v[m];
    for(int i=0;i<m;i++){
    	int x,y;
    	cin >> x >> y;
    	v[i]={y,x};
    }
    sort(v,v+m);
    int c[m],pf[m];
    for(int i=0;i<m;i++){
    	c[i]=v[i].first;
    	pf[i]=v[i].second;
    	if(i)pf[i]=max(pf[i],pf[i-1]);
    }
    if(c[0]<mx){
    	cout << "-1";
    	return 0;
    }
    while(1){
    	int d[n]={0};
    	for(int i=1;i<n;i++){
    		int sum=w[p[i]];
    		d[i]=d[i-1];
    		for(int j=i-1;j>=0;j--){
    			sum+=w[p[j]];
    			int id=lower_bound(c,c+m,sum)-c;
    			if(id)d[i]=max(d[i],d[j]+pf[id-1]);
    		}
    	}
    	ans=min(ans,d[n-1]);
    	if(!next_permutation(p,p+n))
    		break;
    }
    if(ans==(int)1e18)ans=-1;
    cout << ans;
}