#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <map> 
#include <string>
#include <vector>  
#include <iostream> 
#include <sstream> 
#include <queue>
#include <algorithm>

using namespace std;
 
#define ll long long
#define PB 		push_back
#define FOR(a,start,end) 	for(int a=int(start); a<int(end); a++)
#define INF 		INT_MAX
#define SORT(a) 	sort(a.begin(),a.end()) 
#define CL(a,x) 		memset(a,x,sizeof(a))
#define REP(a,x)	for(int a=0;a<x;a++)
#define REP1(a,x)	for(int a=1;a<=x;a++)
#define MP 		make_pair

 
 
typedef vector<int>     vi;
typedef pair<int,int>     pii; 
typedef vector<string> vs;
typedef vector<pii> vii;
typedef vector<vector<int> > vvi;
typedef vector<vector<string> > vvs;
typedef vector<pair<string,string> > vss;
typedef pair<string,string> pss; 
typedef pair<int,pii> ppii;
typedef vector<ppii> vppii;
typedef vector<vector<pii> > vvii;
typedef vector<vvi> vvvi;



int i0,i,j,k,n,a,a2,k1,k2;
int z,c,d,t,z1,n0;
int m,b; 
int cas,g,ng,p,np;

vi vn,vk,va,vc,vc2; 
vii vp,vd;
vvi vvk,vvp;	
pii p1,p2,p0; 
int ta[100],tk[100];

int plecak(int k0){
	int z1,i,j,a,b;
	
	if(k0==n){		//jest rozwiązanie
		z1=1;
		
	}
	else {
		//SORT(vc);
		z1=-1;
		for(i=n-1;i>=0;i--){
			if(ta[i]==0){
							//szukamy jakiegoklowiek rozwiązania
			//	ta[i]=1;
				for(j=m-1;j>=max(0,m-n);j--){
					if(vc[j]>0){
						if(vc[j]>=vn[i]){
							ta[i]=1;
							vc[j]-=vn[i];
							vvk[j].push_back(vn[i]);
							z1=plecak(k0+1);
							break;
						}
					}
				}
				//ta[i]=0;
				break;
			}
		}
		if(z1==-1){
						//szukanie rozwiązania nieskończone
			for(i=n-1;i>=0;i--){
				if(ta[i]==0){
							//największy jaki został
							//spr czy da się zrobic dla niego miejsce
				
					for(j=m-1;j>=max(0,m-n);j--){
						a=vn[i]-vc[j];		//tyle brakuje miejsca w j
						
						for(int i0=0;i0<vvk[j].size();i0++){
							b=vvk[j][i0];
							for(int j1=m-1;j1>=max(0,m-n);j1--){
								if(j!=j1){
									for(int i1=0;i1<vvk[j1].size();i1++){
										if(b-vvk[j1][i1]>=a&&vc[j1]>=b-vvk[j1][i1]){
																			//zamieniamy
											vc[j1]+=b-vvk[j1][i1];
											vc[j]+=vn[i]-(b-vvk[j1][i1]);
											ta[i]=1;
											vvk[j][i0]=a;
											vvk[j1][i1]=b;
											vvk[j].push_back(vn[i]);
											break;
										}
									}
									if(ta[i]==1)
										break;
								}
							}
							if(ta[i]==1)
								break;
						}
						if(ta[i]==1)
							break;
					}
				}
				if(ta[i]==0){
					z1=0;
					break;
				}
			}
			if(z1==-1)
				z1=1;
			
		}

	}
	return z1;
}

int main() {  
//	freopen( "c:\\wojtek\\uva\\pa\\debug\\pak\\pak9.in", "rt", stdin);  
	//	int czas=clock();
	//pi=2*acos(0.0);
	  
	//scanf("%ld",&t);

	cin>>n>>m;
	vn.clear();
	vk.clear();

	d=0;
	for(i=0;i<n;i++){
		cin>>a;
		vn.push_back(a);
		d+=a;
	}
	
	for(i=0;i<m;i++){
		cin>>a;
		vk.push_back(a);
	}

	
	SORT(vk);
	SORT(vn);
	b=0;
	va.clear();
	vvk.assign(m,va);
	vc.assign(m,0);
	//n0=min(n,m);
	for(i=m-1;i>=max(0,m-n);i--){
		b+=vk[i];
		vc[i]=vk[i];
	}
	z=100;
	if(b<d){
		z=-1;
	}
	else {
		CL(ta,0);
		
							//lista plecakow do których mozna to wcisnąć
		i=n-1;
		ta[i]=1;
		j=m-1;		
		if(vc[j]>=vn[i]){
			vc[j]-=vn[i];
			vvk[j].push_back(vn[i]);
			z=plecak(1);
			if(z>0){		//jest rozwiązanie

							//jak je poprawić?
							//spr czy można zmniejszyć ilość plecaków
				
										//szukamy po kolei miejsca dla każdego pakunku z plecaka j 
				for(int j0=m-1;j0>=max(0,m-n);j0--){
					k1=0;
					for(i=0;i<vvk[j0].size();i++){
						int a0=vvk[j0][i];
								//największy jaki został
								//spr czy da się zrobic dla niego miejsce
				
						for(j=m-1;j>=max(0,m-n);j--){
							if(j!=j0&&vc[j]!=0&&vc[j]<vk[j]){
								a=a0-vc[j];		//tyle miejsca w j0 szukamy
								if(a<=0){
									vc[j0]+=a0;
									vc[j]-=a0;
									k1=1;
									vvk[j0].erase(vvk[j0].begin()+i0);
									vvk[j].push_back(a0);
									break;
								}
								else {
						
									for(int i0=0;i0<vvk[j].size();i0++){
										b=vvk[j][i0];
										for(int j1=m-1;j1>=max(0,m-n);j1--){
											if(j1!=j0&&j!=j1&&vc[j1]<vk[j1]&&vc[j1]>0){			//jest częściowo zajęte
												for(int i1=0;i1<vvk[j1].size();i1++){
													if(b-vvk[j1][i1]>=a&&vc[j1]>=b-vvk[j1][i1]){
																						//zamieniamy
														vc[j1]-=b-vvk[j1][i1];
														vc[j]+=b-vvk[j1][i1];
														k1=1;
														vvk[j][i0]=vvk[j1][i1];
														vvk[j1][i1]=b;
														//
														vc[j0]+=a0;
														vc[j]-=a0;
														//k1=1;
														vvk[j0].erase(vvk[j0].begin()+i0);
														vvk[j].push_back(a0);
														break;
													}
												}
												if(k1==1)
													break;
											}
										}
										if(k1==1)
											break;
									}
								}
							}
							if(k1==1)
								break;
						}
						if(k1==0)
							break;
					}
					
				}
				z=0;
				for(j=m-1;j>=max(0,m-n);j--){
					if(vc[j]<vk[j])
						z++;
				}
			}
			
		}
		else
			z=-1;
					
	}
	if(z<=0)
		cout<<"NIE"<<endl;
	else {
		
		cout<<z<<endl;
	}

	

	//czas = clock() - czas;
	//printf("%lf\n",double(czas)/CLOCKS_PER_SEC);					

			
	return 0;
	 
} 
