#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ISNUMERIC(x) (x >= '0' && x <= '9')

#define COMPFUNC

int getInt()
{
	static char num[12];
	int n = 0;
	int c;
	for(c = getchar(); !ISNUMERIC(c); c = getchar());
	num[n++] = c;
	for(c = getchar(); ISNUMERIC(c); c = getchar()){
		num[n++] = (char) c;
	}
	num[n] = 0;
	return atoi(num);
}

int compareUnsigned(const void *a, const void *b){
	if( *((unsigned *)a) > *((unsigned *)b) ) return -1;
	if( *((unsigned *)a) < *((unsigned *)b) ) return  1;
	return 0;
}

int main(int argc, char **argv)
{
	int n;
	int m;
	
	int N;
	int M;
	
	int id;
	
	int pid;
	
	bool success = true;
	
	unsigned *przedmioty;
	unsigned *plecaki;
	
	
	n = getInt();
	m = getInt();
	
	przedmioty = new unsigned[n];
	plecaki = new unsigned[m];
	
	for(int i=0;i<n;++i){
		*(przedmioty + i) = getInt();
	}
	for(int i=0;i<m;++i){
		*(plecaki + i) = getInt();
	}
	// Sortuje malejaco
	qsort(przedmioty,n,sizeof(int),compareUnsigned);
	qsort(plecaki,m,sizeof(int),compareUnsigned);
	N = M = 0;
	pid = 0;
	id = 0;
	while(N < n){
		
		while(*(przedmioty + pid) <= 0 && pid < m) ++pid; // Największy przedmiot
		if(id >= m || *(przedmioty + pid) > *(plecaki + id)){ // Najwiekszy przedmiot sie nie miesci lub brak plecaka
			success = false;
			break;
		}
		// Najwiekszy przedmiot do plecaka
		*(plecaki + id) -= *(przedmioty + pid);
		// Przedmiot oznaczamy za zabrany
		*(przedmioty + pid) = 0;
		++N;
		for(int i = ++pid;i<n && *(plecaki + id) > 0;++i){
			if(*(przedmioty + i) > 0){
				if(*(przedmioty + i) <= *(plecaki + id)){
					*(plecaki + id) -= *(przedmioty + i);
					*(przedmioty + i) = 0;
					++N;
				}
			}
		}
		// 0 = brak miejsca
		*(plecaki + id++) = 0;
		++M;
	}
	
	if(success)
		printf("%d\n",M);
	else
		puts("NIE");
	
	delete plecaki;
	delete przedmioty;
	
	
	return 0;
}