#include <bits/stdc++.h>
using namespace std;
vector<int> v[3010];
int cc[3010][3010];
int num[3010];
int main() {
  int n, m, p, c, i, j, k, fl = 0;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) {
    scanf("%d%d", &p, &c);
    v[p].push_back(c);
  }
  int ma = 0;
  for (i = 2; i <= m; i++) {
    sort(v[i].begin(), v[i].end());
    ma = max(ma, (int)v[i].size());
  }
  if (v[1].size() > ma) {
    cout << 0 << endl;
    return 0;
  }
  long long ans = 1e18;
  for (i = 0; i <= n / 2 + 1; i++) {
    multiset<long long> s;
    long long sum = 0;
    int cnt = 0, zzz = 0;
    for (j = 2; j <= m; j++) {
      num[j] = 0;
      for (k = v[j].size() - 1; k >= 0; k--) cc[j][num[j]++] = v[j][k];
    }
    for (j = 2; j <= m; j++)
      if (v[j].size() > i) {
        for (k = 0; k < v[j].size() - i; k++)
          sum += cc[j][num[j] - 1], num[j]--;
        cnt += v[j].size() - i;
      } else if (v[j].size() >= i)
        zzz++;
    if (cnt + v[1].size() <= i) {
      for (j = 2; j <= m; j++)
        for (k = 0; k < num[j]; k++) s.insert(cc[j][k]);
      for (j = 0; j < i - cnt - v[1].size() + 1 && j < s.size(); j++) {
        sum += *s.begin();
        s.erase(s.begin());
      }
    }
    ans = min(ans, sum);
  }
  printf("%lld\n", ans);
}
