#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

// DEBUG
#ifdef _DEBUG
#define debug(x) cout << #x << ": " << x << endl
#else
#define debug(x)
#endif
// iter
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define REPD(i, n) for (int i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (int i = a; i <= (int)(b); i++)
#define FORD(i, a, b) for (int i = a; i >= (int)(b); i--)
#define FORA(i, I) for (const auto& i : I)
// vec
#define ALL(x) x.begin(), x.end()
#define SIZE(x) ((int)(x.size()))
// 定数
// 2.147483647×10^{9}:32bit整数のinf
#define INF32 2147483647
// 9.223372036854775807×10^{18}:64bit整数のinf
#define INF64 9223372036854775807
// 問題による
#define MOD 1000000007

int main() {
  // 小数の桁数の出力指定
  // cout << fixed << setprecision(10);
  // 入力の高速化用のコード
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int N, K;
  cin >> N >> K;

  vector<vector<int>> A(N, vector<int>(N));
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      cin >> A[i][j];
    }
  }

  vector<int> nums(N - 1);
  iota(nums.begin(), nums.end(), 1);

  int ans = 0;
  do {
    int prev = 0;
    ll sum = 0;
    for (int n : nums) {
      sum += A[prev][n];
      prev = n;
    }
    sum += A[prev][0];
    debug(sum);

    if (sum == K) {
      ans++;
    }
  } while (next_permutation(ALL(nums)));

  cout << ans << endl;

  return 0;
}
#include <stack>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <map>
#include <queue>
#include <set>
#include <cmath>
#define rep1(i, a, n) for (int i = a; i <= n; i++)
#define rep2(i, a, n) for (int i = a; i >= n; i--)
#define mm(a, b) memset(a, b, sizeof(a))
#define elif else if
typedef long long ll;
void mc(int *aa, int *a, int len) { rep1(i, 1, len) * (aa + i) = *(a + i); }
const int INF = 0x7FFFFFFF;
const double G = 10;
const double eps = 1e-6;
const double PI = acos(-1.0);
const int mod = 1e9 + 7;
using namespace std;
struct node
{
    int time;
    int flag;
} no_a[1010], no_b[1010];

bool cmp(node a,node b)
{
    return a.time < b.time;
}

int main()
{
    int n;
    cin >> n;
    rep1(i, 1, n) cin >> no_a[i].time >> no_b[i].time, no_a[i].flag = no_b[i].flag = i;
    sort(no_a + 1, no_a + 1 + n, cmp);
    sort(no_b + 1, no_b + 1 + n, cmp);
    if(no_a[1].flag!=no_b[1].flag)
        cout << max(no_a[1].time, no_b[1].time);
    else
        cout << min(min(max(no_a[1].time, no_b[2].time), max(no_a[2].time, no_b[1].time)), no_a[1].time + no_b[1].time);
    return 0;
}
